Manual/ro

From FreeCAD Documentation
Jump to: navigation, search

Aceasta est o schiță de Manual de FreeCAD în limba română.

Cuprinde părțile esențiale Pagina principală a documentației wiki (Legăturile în roșu nu sunt valide). Aici este pagina principală a Help on-line. Acest manual este special destinat printării ca o carte. Conținutul poate să se schimbe, urmând mersul modificărilor aduse de către contributori pe wiki (Aceste pagini nu au link-uri directe).

Un salt de pagină este prevăzut după fiecare rubrică. Mascați sau nu Cuprinsul, înainte de printare puteți verifica afișarea prin "Previzualizare".


Freecadsplash017.png




Generalități despre FreeCAD

Freecad default.jpg

FreeCAD este un soft de modelare parametrică 3D și face parte din marea familie a software CAD . Dezvoltarea este în întregime Open Source Open Source (LGPL License)(licences GPL et LGPL). FreeCAD and este orientat spre inginerie mecanică mechanical engineering și proiectarea de produse product design, dar vizează de asemenea și alte domenii de activitate inginerească (ca arhitectura, construcțiile în general, navele, robotica, etc).

Caracteristicile instrumentelor FreeCAD sunt similare cu Catia, SolidWorks sau Solid Edge, și de aceea intră în categoria MCAD, PLM, CAx și CAE. Este un feature based parametric modeler cu o arhitectură software modulară care facilitează furnizarea de funcționalități suplimentare fără a modifica sistemul central.

Ca și multe alte modelatoare moderne 3D CAD modelers are multe componente 2D pentru a schița forme 2D sau pentru a extrage detaliile de proiectare de la modelul 3D pentru a crea desene de producție 2D, desen 2D direct.(like AutoCAD LT) nu este focalizat nici pe animație sau forma organice (ca de exemplu Maya, 3ds Max, Blender or Cinema 4D), în ciuda adaptabilității sale largi, FreeCAD poate fi mult mai util într-o paletă largă dea domenii decât în prezent.

FreeCAD utilizează din greu toate bibliotecile mari open source care există în domeniul Scientific Computing. Printre ele sunt OpenCascade, a powerful CAD kernel, Coin3D, o încarnare a Open Inventor, Qt, the world-famous UI framework, and Python, una dintre cele mai bune limbaje de scripting disponibile. FreeCAD în sine poate fi folosit ca o bibliotecă de alte programe.

FreeCAD este de asmenea plin de multi-platform, și rulează în mod curent fără probleme pe sistemele Windows și Linux / Mac OSX, având exact același aspect și funcționalitate pe toate platformele.

Pentru mai multe informații despre capabilitățile FreeCAD, aruncați o privire laFeature list, the latest release notes or the Getting started articles, or see more screenshots.

Despre proiectul FreeCAD

Proiectul FreeCAD a început tocmai din anul 2001, după cum se descrie pagina sa de istorie history .

FreeCAD este menținută și dezvoltată de o comunitate de dezvoltatori și utilizatori entuziaști (vezi pagina contributors). Ei lucrează pe FreeCAD în mod voluntar, în timpul lor liber. Ei nu pot garanta că FreeCAD va conține toți v-ați dori, dar de obicei ei vor face tot ce pot! Comunitatea se adună pe forumul FreeCAD, unde se discută majoritatea ideilor și deciziilor. Simțiți-vă liber să vă alăturați!

Aceasta pagina prezinta o mare parte dintre funcționalitățile FreeCAD. Daca doriti sa priviti in viitor vizitati pagina de planificare. Pagina de screenshot-uri va poate face o iede rapida despre capabilitati.

Descrierea versiunilor

Funcționalități importante

  • Feature1.jpg
    O tehnologie completă bazată pe nucleu geometric al Open CASCADE e care permite operații 3D complexe pe tipuri complexe de forme, cu suport nativ pentru concepte precum BRep, curbe Nurbs si suprafețe, o gama largă de entitățti geometrice, operatiuni logice, suport pentru integrat pentru formatele STEP și IGES.
  • Feature3.jpg
    Un model parametric complet. Toate obiectele FreeCAD sunt parametrizate, ceea ce inseamna ca forma lor poate depinde de proprietati sau de alte obiecte, cu modificarile calculate la cerere si inregistrate in stiva undo/redo. Tipuri noi de obiecte pot fi adaugate cu usurinta si sunt programabile in Python.
  • Feature4.jpg
    Arhitectura modulara ce permite modulelor sa adauge noi functionalitati la pachetul de baza. Extensiile pot fi complexe, precum intregi aplicatii programate in C++, sau simple, precum script-uri Python sau macroinstructiuni inregistrate automat. Utilizatorul are control complet asupra interpretorului Python continut, asupra macroinstructiunilor si script-urilor externe si asupra componentelor FreeCAD: crearea si transformarea geometriei, representarea in 2D sau 3D a geometriei sub forma de grafice sau chiar interfata grafica
  • Feature7.jpg
    Editarea schitelor cu constrangeri, permitand schitarea formelor 2D constranse ca si geometrie. E posibila crearea catorva tipuri de geometrii constranse precum si imbinarea lor.
  • Feature9.jpg
    Simulator de roboti ce permite studierea miscarilor robotilor. Modulul are deja o interfata grafica extinsa, permitand realizarea intregului flux in mod grafic.
  • Feature8.jpg
    Foi de desen ce permit crearea de vizualizari 2D ale desenului 3D pe o foaie. Acest modul produce foi SVG sau PDF gata de a fi exportate. Acest modul este in lucru, dar are deja implementata functionalitatea Python.
  • Feature-raytracing.jpg
    Modulul de Afisare poate exporta obiectele 3D pentru a fi folosite de programe externe. Singurul format suportat in prezent este povray, dar alte formate sunt planificate pentru viitor.
  • Feature-arch.jpg
    Modulul Arhitectural permite lucrul folosing pasii BIM compatibil cu IFC. Comunitatea a dezbatut aprins detaliile modlului in forum.

Funcționalități generale:

  • FreeCAD este Multi-platformă. Rulează și se comportă la fel pe platformele: Windows, Linux si MacOS.
  • FreeCAD este o aplicație grafică. FreeCAD are o interfață bazată pe librariile Qt, cu vizualizari 3D bazate pe Open Inventor, permițând viteze mari de randarea a scenelor 3D ți o prezentare accesibilă a componentelor scenelor.
  • FreeCAD e disponibil de asemena în modul linie de comandă, folosind foarte puține resurse de memorie. In modul linie de comandă FreeCAD rulează fără componentele de interfață grafică dar cu toate uneltele geometrice. In acest context, poate fi folosit ca si server pentru a produce conținut util altor aplicatii.
  • FreeCAD poate fi încorporat ca și modul Python in alte aplicatii capabile sa ruleze module Python, inclusiv in interpretorul Python implicit. Ca si în modul consolă, interfața grafică FreeCAD
este nedisponibilă, dar uneltele geometrice sunt accesibile.
  • Conceptul de Workbench: În interfața grafica FreeCAD uneltele sunt grupate în ateliere (workbench), ceea ce permite afișarea instrumentelor strict necesare la indeplinirea unui obiectiv, lăsând interfața ordonată și responsiva si permitand aplicației sa se încarce rapid.
  • Arhitectura modulara cu plug-in-uri pentru incarcarea intarziata a componentelor si tipurilor de date. FreeCAD este impartit in functionalitate centrala si module ce sunt incarcate in memorie doar la nevoie. Aproape toate uneltele si tipurile geometrice sunt localizate in module. Acestea se comporta precum plug-in-urile si pot fi adaugate sau indepartate dintr-un pachet FreeCAD instalat.
  • Asociativitatea obiectelor pe baza parametrilor: Toate obiectele dintr-un document FreeCAD pot fi definite de parametri. Acestia pot fi modificati si recalculati oricand. Relatiile dintre obiecte sunt de asemenea stocate, astfel ca modificare unui obiect atrage dupa sine modificarea obiectelor dependente.
  • Crearea de primitive (cutie, sfera, cilindru, etc), expandare (normal sau in mod Jung/Shin/Choi) sau operatiuni logice (adauga, intersecteaza, taie).
  • Operatii de modificare grafică precum translații, rotații, scalari, copiere in oglindă, expandare, (trivial or after Jung/Shin/Choi) convertirea formei în orice plan sau în spațiul 3D
  • Creare grafica pentru geometrie planară simplă precum linii, polilinii, dreptunghiuri, b-splines, circular or elliptic arce în orice plan sau în spațiul 3D.
  • Modelarea folosind extruziuni, sectiuni si panglici, in linie dreapta sau prin rotatie.
  • Componente topologice precum varfuri, margini, polilinii si planuri (folosind de asemenea script-uri Python).
  • Unelte de testare si reparare a retelelor: pentru solide, tools for meshes: solid test, test non-two-manifolds, autointersectie, umplere goluri si orientare uniforma.
  • Notatii precum text liber sau dimensiuni
  • Undo/Redo Toate operatiunile pot fi inlaturate sau redate individual sau in pasi multipli.
  • Managementul tranzactiilor: stiva undo/redo stocheaza tranzactii in document si nu actiuni individuale permitand fiecarui component sa aleaga ce trebuie sa fie modificat la undo/redo.
  • Script incorporat: FreeCAD contine un interpretor Python si API (functii) ce acopera aproape toate componentele aplicatiei, interfata, geometria si reprezentarea acesteia in vizualizarile 3D. Interpretorul poate rula atat comenzi simple cat si rutine complexe; exista module intregi ce au fost programate in intregime in Python.
  • Consola Python incorporata cu sintaxa evidentiata, completare automata si explorator de clase; comenzile Python pot fi adresate direct in FreeCAD si afiseaza rezultatul imediat, permitand celor ce utilizeaza scripturi sa testeze functiile, sa exploreze continutul modulelor si sa invete usor arhitectura FreeCAD.
  • Acțiunile utilizatorului sunt afișate în consolă: Tot ce face utilizatorul se traduce în cod Python, care poate fi printat la consolă sau înregistrat ca și macroinstrucțiuni.
  • Inregistrarea si editarea macroinstructiunilor: Comenzile Python issued when the user manipulates the interface pot fi inregistrate, editate dacă e nevoie, și salvate pentru a fi reproduse mai târziu.
  • Format de fisier modular bazat pe ZIP: Documentele salvate cu extensia .fcstd pot contine un mare numar de informatii diferite precum: geometrie, script-uri sau previzualizari. The .fcstd file is itself a zip container, so a saved FreeCAD file has already been compressed.
  • Interfata grafica pe de-a-ntregul configurabila. Interfata bazata pe Qt este accesibila interpretorului Python. Pe langa functii simple furnizate de modulul FreeCAD central, intreaga interfata este si ea accesibila, permitand orice operatii asupra aparentei: creare, adaugare, andocare, modificare si indepartare a ferestrelor si barelor de instrumetne.
  • Thumbnailer (doar pentru sisteme Linux în acest moment): iconițele pentru documentele FreeeCAD prezintă conținutul fișierului în majoritatea programelor de management, precum Nautilus in Gnome.
  • Instalare MSI modulara permite instalarea flexibila pe sisteme Windows. Pentru Ubuntu au fost pregatite de asemenea pachete de instalare.

In lucru

  • Feature-assembly.jpg
    Un modul de asamblare ce permite lucrul cu mai multe proiecte, forme, documente, fisiere, relatii... This module is currently in planning state.

Extra Workbenches

Power users have created various custom external workbenches.


Instalarea

Instalarea sub Windows


Cea mai usoară cale de instalare sub Windows este de a descărca unul dintre programele de instalare de mai jos.

Windows.png Windows 32 bit (sha256)

Windows.png Windows 64 bit (sha256)


Dupa ce fișierul .msi (Microsoft Installer) a fost descarcat, doar faceți dublu-click pe el pentru a începe instalarea.


Mai jos sunt descrise opțiunile de instalare. Daca pare complicat nu va ingrijorați! Cei mai mulți utilizatori nu vor avea nevoie de nimic mai mult decat fișierul de mai sus .msi și articolul Primii pasi!


Instalare Simpla Folosind Microsoft Installer

Cea mai ușoară cale de instalare a FreeCAD sub Windows este de a folosi programul descărcabil de instalare de mai sus. Aceasta pagina descrie modul de folosire și funcționalitățile programului Microsoft Installer pentru a accesa mai multe opțiuni de instalare.

Daca doriți sa descărcați versiunea pe 64 de biți sau versiunea aflată acum în dezvoltare (care ar putea fi instabilă) vizitați pagina de descărcări.

Chocolatey

However, it is highly recommended that you use a package manager such as Chocolatey to keep your software updated. You can installed Chocolatey following these instructions and then open a PowerShell terminal as admin and run:

choco install freecad

every once in a while you can update your software with

choco upgrade freecad

to get the latest version available on Chocolatey repository. If there are any issues with the chocolatey package, you may contact maintainers on this page.


Instalare de la Consola de Comandă

Cu ajutorul utilitarului linie de comandă "msiexec.exe", sunt disponibile funcții suplimentare, cum ar fi instalarea non-interactivă și instalarea ca administrator. Vedeți exemplele de mai jos.

Instalarea Automată

Folosind comanda:

 msiexec /i FreeCAD<version>.msi

instalarea poate fi inițiată programat. Parametrii suplimentari pot fi transmiși la sfârșitul liniei de comandă, de exemplu:

msiexec /i FreeCAD-2.5.msi TARGETDIR=R:\FreeCAD25

Interfața Limitată

Numărul de ferestre de dialog permise utilizatorului poate fi controlat cu grupul de optiuni /q, astfel:

  • /qn - fără interfață
  • /qb - interfață minimală - o fereastră ce indica doar progresul având butonul Cancel
  • /qb! - precum/qb, dar fără butonul "renunță" (Cancel)
  • /qr - interfață redusă - prezintă toate ferestrele dar nu solicită intervenția utilizatorului

(sare peste toate dialogurile modale)

  • /qn+ - precum /qn, dar afișează mesajul "Completed" la sfârșit
  • /qb+ - precum /qb, dar afișează mesajul "Completed" la sfârșit

Directorul Țintă

Proprietatea TARGETDIR determină locația de instalare a FreeCAD. De exemplu o locație se specifică folosind

TARGETDIR=R:\FreeCAD25

Implicit TARGETDIR este [WindowsVolume\Programm Files\]FreeCAD<versiune>.

Instalarea Pentru Toti Utilizatorii

Adaugand

ALLUSERS=1

determină o instalare utilizabilă de către toți utilizatorii. În mod implicit, o instalare non-interactivă (/ i) face ca pachetul să poată fi utilizat numai de utilizatorul curent (cel care efectuează instalarea); o instalare interactivă prezintă un dialog care implică "toți utilizatorii" dacă utilizatorul care realizează instalarea are suficiente drepturi de administrare.

Selectarea Caracteristicilor

Un numar de caracteristici pot fi alese pentru instalare, reinstalate sau indepartate. Cracteristicile ce pot fi selectate pentru FreeCAD sunt:

  • DefaultFeature - instaleaza pachetul software propriu-zis și nucleul de librării utilizate
  • Documentation - instalează documentația
  • Source code - instalează codul sursă
  • ... ToDo

In plus, optiunea ALL activeaza toate caracteristicile. Toate componentele depind de DefaultFeature, astfel ca instalarea oricarei alteia va instala si caracteristicile implicite. Urmatoarele variabile controleaza caracteristicile instalate sau inlaturate:

  • ADDLOCAL - lista componentelor ce vor fi instalate în sistem
  • REMOVE - lista componentelor ce vor fi înlaturate din calculatorul local
  • ADDDEFAULT - lista componentelor adăugate în configurare implicită (local pentru toate funcționalitățile FreeCAD)
  • REINSTALL - lista componentelor ce vor fi reinstalate/reparate
  • ADVERTISE - lista funcționalităților care se instalează public

Pentru restul de proprietati disponibile consultati documentatia MSDN disponibila on-line.

Pe baza celor spuse mai sus, adaugand

ADDLOCAL=Extensions

programul va instala interpretatorul si va inregistra extensiile dar nu instaleaza nimic altceva.

Dezinstalarea

Folosind

msiexec /x FreeCAD<version>.msi

FreeCAD poate fi dezinstalat. Daca fisierul .msi nu este disponibil pachetul poate fi dezinstalat folosind codul prodsului sau pachetului. Codul produsului poate fi aflat exminand proprietatile scurtaturii Uninstall pe care FreeCAD o instaleaza in meniul Start.

Instalare în rețea

Folosind

msiexec /a FreeCAD<version>.msi

o instalare "administrativa" (in retea) poate fi realizata. Fisierele sunt extrase in directorul tinta (care trebuie sa fie un director de retea), dat nici o alta modificare nu este adusa calculatorului local. In plus, un fisier .msi (de dimensiuni reduse) este generat in directorul tinta. Utilizatorii calculatorului tinta pot folosi apoi fisierul .msi generat pentru instalare (e posibil ca versiunile viitoare sa ofere posibilitatea stocarii unor fisiere in directorul de retea (comun)).

Pentru instalarea administrativa nu exista interfata grafica, astfel ca directorul de retea trebuie specificat la linia de comanda.

Nu există nici o procedură de dezinstalare specifică pentru o instalare de administrator - doar ștergeți directorul țintă în cazul în care nici un client nu-l mai folosește.

Publicitate

Folosind

msiexec /jm FreeCAD<version>.msi

ar fi posibil, în principiu, sa "publicam" FreeCAD la un calculator (cu /ju la un utilizator). Acest lucru ar face pictogramele să apară în meniul de start și extensiile să fie înregistrate, fără ca software-ului sa fie instalat. Prima utilizare a unei funcționalități ar conduce la instalarea sa.

Instalatorul FreeCAD acceptă în prezent doar "publicitate" pentru intrări in meniul Start, nu și pentru comenzi rapide.

Instalare Automata pe un Grup de Calculatoare

Folosind Windows Group Policy este posibil sa se instaleze FreeCAD automat pe un grup de calculatoare. Pentru a face asta urmați următorii pași:

  1. Autentificați-vă în controlller-ul de domeniu
  2. Copiați fișierul MSI intr-un director partajat la care au acces toate calculatoarele
  3. Deschideți "Active Directory users and computers"
  4. Navigați la grupul de calculatoare pe care se instalează FreeCAD
  5. Deschideți Proprietăț
  6. Deschideți Politici de Grup
  7. Adaugati o noua politica și editați-o
  8. In Configurări Calculator/Instalare soft selectați Nou/Pachet
  9. Selectați fișierul MSI folosind calea de rețea
  10. Puteți opta ca FreeCAD să fie dezinstalat dacă părăsește rețeaua

Acest mod de instalare durează ceva timp, de obicei. Pentru finalizarea instalării toate calculatoarele trebuiesc repornite.

Instalarea in Linux folosind Crossover Office

Versiunea de FreeCAD pentru Windows poate fi instalată pe un sistem Linux folosind CXOffice 5.0.1. Rulați comanda msiexec de la linia de comandă CXOffice. Presupunând că pachetul de instalare se află în directorul "soft" pe discul "Y:":

msiexec /i Y:\\software\\FreeCAD<version>.msi
msiexec /i Y:\\software\\FreeCAD<version>.msi

FreeCAD rulează dar s-a raportat că interfața OpenGL nu funcționează, la fel ca și în cazul altor programe rulate sub Wine, de exemplu Google SketchUp.

Instalarea sub Unix/Linux

Instalarea FreeCAD pe cel mai binecunoscut sistem linux este sustinuta de comunitate si FreeCAD ar trebui sa fie accesibil direct folosind managerul de pachete disponibil in fiecare distributie. Echipa FreeCAD furnizeaza si un numar de pachete "oficiale" cand sunt produse versiuni noi si un numar de locatii (PPA repository) pentru testarea celor mai noi modificari/functionalitati.

Odata FreeCAD instalat este timpul pentru primii pasi!

Ubuntu și sistemele bazate pe Ubuntu

Multe distribuții Linux se bazează pe Ubuntu și partajează depozitele sale. Pe lângă variantele oficiale (Kubuntu, Lubuntu și Xubuntu), există distribuții non-oficiale, cum ar fi Linux Mint, Voyager și altele. Opțiunile de instalare de mai jos trebuie să fie compatibile cu aceste sisteme.

Depozite oficiale de Ubuntu

FreeCAD este disponibil din depozitele Ubuntu și poate fi instalat prin intermediul Centrului de software sau cu această comandă într-un terminal:

sudo apt-get install freecad

Dar există șanse ca această versiune stabilă să fie depășită și să nu aibă cele mai recente caracteristici. Pentru a obține ultima versiune, vă rugăm să folosiți PPA.

Stable PPA with GUI

Pentru a instala FreeCAD utilizând PPA, din interfața grafică, urmați acele instrucțiuni. Comunitatea FreeCAD oferă o PPA repository on Launchpad cu ultima versiune stabilă FreeCAD.

Trebuie să adăugați la sursele software ale sistemului următoarele PPA. Pentru aceasta, navigați la Centrul de software Ubuntu> Edit> Software sources> Other software. Faceți clic pe adăugați, copiați și urmați codul de mai jos:

ppa:freecad-maintainers/freecad-stable

Actualizați sursele de software, dacă vi se solicită acest lucru. Acum puteți găsi și instala ultima versiune FreeCAD stabilă în Centrul de software Ubuntu.

Stable PPA with console

Tastați sau copy-paste aceste comenzi într-o consolă pentru a adăuga PPA:

Pentru PPA stabil

sudo add-apt-repository ppa:freecad-maintainers/freecad-stable

Nu uitați să preluați actualizările listelor de pachete:

sudo apt-get update

Actualizare sincronizează lista de pachete disponibile cu serverele.

Apoi, instalați FreeCAD împreună cu documentația:

sudo apt-get install freecad freecad-doc && sudo apt-get upgrade

Actualizați descărcările și instalați cea mai nouă versiune de pachete a programelor instalate. Acesta va fi aplicat tuturor software-urilor instalate pe computer.

Executați această comandă pentru a deschide versiunea stabilă a FreeCAD:

freecad

Daily PPA with console

Dacă doriți să instalați ultima versiune instabilă a FreeCAD, utilizați PPA numit"freecad-daily" PPA repository on Launchpad. Astfel puteți accesa ultimile ameliorări ale dezvoltării FreeCAD. Acest PPA este compilat automat zilnic de la depozitul oficial al FreeCAD. Acesta va conține, de obicei, numeroase corecții de erori și actualizări ale funcțiilor.

Pentru PPA zilnic:

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

You can then update to the latest daily at any time with:

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

Executați această comandă pentru a deschide versiunea zilnică a FreeCAD:

freecad-daily

Debian și alte sisteme înrudite

Începând cu Debian Lenny, FreeCAD este disponibil direct din depozitele de software Debian și poate fi instalat în mod sinaptic sau pur și simplu cu:

sudo apt-get install freecad

OpenSUSE

FreeCAD se poate instala folosind comanda:

zypper install FreeCAD

Gentoo

FreeCAD se construieste si instaleaza folosind comanda:

emerge freecad

Fedora

FreeCAD a fost inclus în pachetul oficial al Fedora packages începând cu Fedora 20. Acesta paote fi instlat de la linia de comandă cu:

sudo dnf install freecad

În edițiile mai vechi ale Fedora, acesta era:

sudo yum install freecad

Managerul vizual al pachetului poate fi cde asemenea utilizat. Căutați pentru "

"freecad".

Versiunea oficială a pachetului de lansare Fedora tinde să fie mult în urma versiunilor FreeCAD.Package: freecad arată versiunile incluse în depozitele Fedora în decursul timpului și al versiunilor.

Versiuni mai actuale pot fi obținute prin descărcarea unuia dintre .AppImage ediții din depozitul github. Acestea funcționează bine sub Fedora.

Dacă doriți să țineți cont de cele mai recente realizări zilnice, FreeCAD este, de asemenea, disponibil copr. Pentru a instala build-ul de acolo, într-o sesiune pe terminal, introduceți:

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

Asta pleacă din copr depozit activ, deci

sudo dnf upgrade

sau echivalent, se va actualiza la cea mai recentă construcție FreeCAD, împreună cu actualizările de la oricare dintre celelalte repo-uri active. Dacă vrei ceva mai stabil, poți dezactiva @freecad/nightly după instalarea inițială. copr repozitoriul se bazează numai pe cele din ultimele 2 săptămâni. Aceasta nu este o soluție dacă doriți să alegeți o versiune mai veche.

Instrucțiunile sunt de asemenea disponibile pe compile FreeCAD yourself, inclusiv un script specific pentru Fedora. Cu o schimbare minoră, pentru a finaliza comiterea specifică de la git, orice versiune din moment ce despre FreeCAD 0.15 poate fi construită pe orice distribuție de la Fedora 21.

Arch

Installing FreeCAD on Arch Linux and derivatives (ex. Manjaro):

pacman -S freecad

Altele

Daca sistemul pe care lucrați are FreeCAD dar nu este listat aici informati-ne folosind forumul!

Numeroase pachete alternative, neoficiale sunt disponibile pe net, de exemplu pentru sisteme precum slackware sau fedora. O căutare pe net relevă numeroase rezultate.

Instalare manuală pe sisteme bazate pe Debian

Daca, dintr-un oarecare motiv, nu puteti folosi una dintre metodele listate mai sus puteți oricând descărca unul dintre pachetele .deb packages disponibile in pagina de descarcari. Linux.png Ubuntu 32/64bit AppImage-logo.png AppImage 64bit

Odată pachetul .deb descărcat, daca aveți pachetul Gdebi instalat (de obicei este), tot ce trebuie să faceți este să navigați la locul descarcării și sa faceți dublu-click. Dependențele vor fi rezolvate automat de pachetul de management al softurilor. Alternativ pachetul poate fi instalat folosind linia de comandă, folosind :

sudo dpkg -i Name_of_your_FreeCAD_package.deb

Desigur Numele_pachetului_FreeCAD trebuie inlocuit cu numele fișierului descărcat.

După instalarea FreeCAD o iconiță va apărea în secțiunea "Grafica" din meniul de start.

Instalarea pe alte sisteme Linux/Unix

Multe distribuții comune Linux includ acum un FreeCAD precompilat ca parte a pachetelor standard. Acest lucru este deseori depășit, dar este un loc pentru a începe. Verificați administratorii standard de pachete pentru sistemul dvs. Una din lista următoare (parțială) a comenzilor ar putea instala versiunea oficială a FreeCAD pentru distro dvs. de la terminal. Acestea probabil au nevoie de privilegii de administrator.

apt-get install freecad
dnf install freecad
emerge freecad
slackpkg install freecad
yum install freecad
zypper install freecad
Numele pachetului este sensibil la minuscule, deci încercați `FreeCAD`, precum și` freecad`. Dacă aceasta nu funcționează pentru dvs., fie pentru că managerul de pachete nu are disponibilă o versiune FreeCAD precompilată, fie pentru că versiunea disponibilă este prea veche pentru nevoile dvs., puteți încerca să descărcați una dintre .AppImage

eliberări din depozitul github. Acestea tind să lucreze la cele mai multe distribuții linux de 64 biți, fără o instalare specială. Doar asigurați-vă că fișierul descărcat este marcat ca executabil, apoi executați-l.

Dacă aceasta încă nu este suficient de bună și nu puteți localiza o altă sursă a unui pachet precompilat pentru situația dvs., va trebui să compilați compile FreeCAD yourself.

Instalarea versiunii pentru Windows in Linux

A se vedea pagina Instalarea in Windows.

Instalarea sub Mac

FreeCAD poate fi instalat in Mac OS X intr-un singur pas folosind programul de instalare.

Stable.pngMac.png MacOS 10.11 El Capitan 64-bit (sha256)


and the nightly build can be downloaded from

Nightly.pngNightly 19_pre (sha256)

However, it is highly recommended to use a package manager such as HomeBrew to keep your software updated. Instructions to install HomeBrew can be seen here. When HomeBrew installed you can simply install FreeCAD through your bash terminal with

brew cask install freecad

and to upgrade the software to the latest version available on HomBrew Cask you may run

brew cask upgrade freecad

If there are any issues with the HomeBrew Cask formula you may report here.

Această pagină descrie utilizarea și caracteristicile instalatorului FreeCAD. De asemenea, include instrucțiuni de dezinstalare. După ce ați instalat, puteți get started!

Instalarea simpla

Programul de instalare FreeCAD este furnizat ca pachet app (.app) inclus în fișierul imagine

a disk ului.

Cea mai recenta versiune se poate descarca din pagina de Download. Odata descarcat fisierul imagine al disk ului, apoi glisați-l în Application folder sau orice alt folder doriți

Mac installer 1.png

Et voila! Faceți doar click pe app pentru a lansa FreeCAD. Dacă întâlniți acest mesaj "FreeCAD can't be open as it is from unidentified developer. " Deschideți folderul (Application) și click dreapta pe app apoi click deschideți și acceptați deschiderea applicației.


Dezinstalarea

Încă nu există un program de dezinstalare pentru FreeCAD. Pentru a înlătura complet programul și toate componentele instalate trageți următoarele fișiere și directoare în coșul de Gunoi:

  • In /Applications:
    • FreeCAD

Asta-i tot.

Introducere în FreeCAD

Arrow-left.svg Previous: Install on Mac

Cuvânt înainte

FreeCAD este o aplicaţie parametrică de modelare CAD/CAE. A fost creată în principal pentru desen tehnic, dar de asemenea serveşte tuturor nevoilor de modelare a unor obiecte 3D, cu precizie maximă şi control asupra etapelor de modelare.


FreeCAD se află încă în stadii incipiente de dezvoltare, și oferă o listă largă (și în dezvoltare) de features. Unele capabilități lipsesc încă comparativ cu soluțiile comerciale și le puteți găsi insuficient dezvoltate pentru a le utiliza în mediul industrial. Cu toate acestea, există o comunitate de utilizatori etuziaști community , și puteți găsi deja many examples de proiecte de calitate dezvoltate cu FreeCAD.

Ca toate proiectele open source, proiectul FreeCAD nu este doar o modalitate de a lucra pentru dezvoltatorii săi. Depinde mult de comunitatea sa să crească, să câștige experiență și să se stabilizeze (să se fixeze bug-urile). Nu uitați acest lucru când începeți să utilizați FreeCAD, dacă vă place, puteți influența direct proiectul help!

Instalare

Mai întâi de toate, descărcați și instalați FreeCAD. Consultați pagina Download pentru informații despre versiunile și actualizările curente și pagina Installing pentru instrucțiuni de instalare. Există pachete de instalare gata pentru Windows (.msi), Debian și Ubuntu (.deb), openSUSE (.rpm) și Mac OSX. FreeCAD este disponibil la administratorii pachetelor de la mai multe distribuții Linux. Este disponibil și un executabil standalone AppImage, care va funcționa pe cele mai recente sisteme Linux pe 64 de biți. Deoarece FreeCAD este open-source, poți descărca și codul sursă și compila pe tine însuți.

Explorarea aplicației FreeCAD

FreeCAD interface.png
  1. Vederea 3D, afișează conținutul documentului
  2. Vizualizarea arborescentă, care prezintă ierarhia și istoricul construcțiilor tuturor obiectelor din document
  3. properties editor, care vă permite să vizualizați și să modificați proprietățile obiectelor selectate,
  4. Vizualizarea raportului (sau fereastra de ieșire), în care FreeCAD imprimă mesaje, avertismente și erori
  5. Consola python, în care sunt tipărite toate comenzile executate de FreeCAD și unde puteți introduce codul python
  6. workbench selector, unde selectați atelierul de lucru activ

Conceptul principal din spatele interfeței FreeCAD este că este separat în ateliere. Un Atelier de lucru este o colecție de instrumente pentru o anumită sarcină, cum ar fi plase/rețele de discretizare meshes, sau desen 2D objects, sau constrained sketches. Puteți schimba atelierul de lucru curent cu selectorul de bibliotecă de lucru (6). Poți customize Instrumentele incluse în fiecare atelier de lucru, adăugați unelte de la alte ateliere de lucru sau chiar unelte create de noi, pe care le numim macros. Punctele de pornire utilizate pe scară largă sunt PartDesign Workbench and Part Workbench.

Când porniți FreeCAD pentru prima dată, vi se prezintă centrul de pornire. Iată cum arată acesta pentru versiunea 0.16

Startcenter.jpg

Pentru FreeCAD 0.17 vedeți asceasta start center screenshot.

Pagina de Start vă permite să vă îndreptaţi rapid către unul atelierele obişnuite, să deschideţi fişierele folosite recent sau să citiţi cele mai noi ştiri din lumea FreeCAD. Puteţi schimba atelierul implicit cu opţiunea Preferinţe din meniul "Editare".

Navigarea în spatiul 3D

FreeCAD vă oferă mai multe moduri de navigare cu mouse-ul diferite, ceea ce schimbă felul în care mouse-ul Dvs. interacţionează cu obiectele reprezentate 3D şi cu însuşi felul de vizualizare. Unul dintre ele este făcut anume pentru touchpads, unde nu se foloseşte butonul din mijloc. Următorul tabel descrie modul implicit, numit Navigare CAD (puteţi schimba rapid modul de navigare curent prin clic cu butonul drept pe un o porţiune goală din spaţiul 3D):

Selectare Translatie Zoom Rotire
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
pentru selectie pentru translatie pentru a mari sau micsora pentru a roti vizualizarea
Apasati butonul stanga al mouse-ului deasupra obiectului de selectat. Apasarea tastei CTRL permite selectarea mai multor obiecte. Apasati butonul din mijloc si miscati mouse-ul pentru a translata vizualizarea. Folositi rotita mouse-ului pentru a mari sau micsora. Apasati mai intai butonul din mijloc al mouse-ului, tineti-l apasat si apasati butonul stanga al mouse-ului si mutati-l in directia dorita. Functioneaza ca o bila ce se roteste in jurul centrului. Daca eliberati butoanele inainte de a inceta miscarea vizualizarea va continua sa se roteascain jurul centrului, daca aceasta caracteristica e activata. Dublu-click folosind butonul mijlociu pe oricare parte a unui obiect seteaza noul centru de rotatie si panorameaza pe acest punct.


Select Pan Zoom Rotate view
First method
Rotate view
Alternate method
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png Rotate cursor.png
Mouse LMB.svg Mouse MMB hold.svg Mouse MMB rotate.svg Mouse MMB+LMB hold.svg Mouse MMB+RMB hold.svg
Press the left mouse button over an object you want to select.

Holding down Ctrl allows the selection of multiple objects.

Hold the middle mouse button, then move the pointer. Use the mouse wheel to zoom in and out.

Clicking the middle mouse button re-centers the view on the location of the cursor.

Hold the middle mouse button, then press and hold the left mouse button, then move the pointer.

The cursor location when the middle mouse button is pressed determines the center of rotation. Rotation works like spinning a ball which rotates around its center. If the buttons are released before you stop the mouse motion, the view continues spinning, if this is enabled.

A double click with the middle mouse button sets a new center of rotation.

Hold the middle mouse button, then press and hold the right mouse button, then move the pointer.

With this method the middle mouse button may be released after the right mouse button is held pressed.

Users who use the mouse with their right hand may find this method easier than the first method.

Ctrl+Mouse RMB.svg Ctrl+Shift+Mouse RMB.svg Shift+Mouse RMB.svg
Pan mode: hold the Ctrl key, press the right mouse button once, then move the pointer. introduced in version 0.17 Zoom mode: hold the Ctrl and Shift keys, press the right mouse button once, then move the pointer. introduced in version 0.17 Rotate mode: hold the Shift key, press the right mouse button once, then move the pointer. introduced in version 0.17

Holding down Ctrl allows the selection of multiple objects. |Pan_text=Hold the middle mouse button, then move the pointer. |Pan_mode_text=Pan mode: hold the Ctrl key, press the right mouse button once, then move the pointer. introduced in version 0.17 |Zoom_text=Use the mouse wheel to zoom in and out.

Clicking the middle mouse button re-centers the view on the location of the cursor. |Zoom_mode_text=Zoom mode: hold the Ctrl and Shift keys, press the right mouse button once, then move the pointer. introduced in version 0.17 |Rotate_view_text=Hold the middle mouse button, then press and hold the left mouse button, then move the pointer.

The cursor location when the middle mouse button is pressed determines the center of rotation. Rotation works like spinning a ball which rotates around its center. If the buttons are released before you stop the mouse motion, the view continues spinning, if this is enabled.

A double click with the middle mouse button sets a new center of rotation. |Rotate_view_mode_text=Rotate mode: hold the Shift key, press the right mouse button once, then move the pointer. introduced in version 0.17 |Rotate_view_alt_text=Hold the middle mouse button, then press and hold the right mouse button, then move the pointer.

With this method the middle mouse button may be released after the right mouse button is held pressed.

Users who use the mouse with their right hand may find this method easier than the first method. }}

Exista moduri de vizualizare predefinite (de sus, din fata, etc) ce se schimba folosind meniul Vizualizare, comenzile din bara de unelte Vizualizare sau scurtaturile numerice (1, 2, etc...) . Făcând clic dreapta pe un obiect sau pe o zonă goală a vizualizării 3D, aveți acces rapid la unele operații comune, cum ar fi setarea unei anumite vizualizări sau localizarea unui obiect în vizualizarea tip Arbore.

Primii paşi în FreeCAD

Aplicația FreeCAD este de a vă permite să realizați modele 3D de înaltă precizie, să păstrați controlul strict al acestor modele (să reveniți la istoricul de modelare și să modificați parametrii) și să construiți aceste modele (prin imprimare 3D, prelucrare CNC sau chiar în construcții civile). Prin urmare, este foarte diferit de alte aplicații 3D realizate în alte scopuri, cum ar fi filmul de animație sau jocurile de noroc. Curba de învățare poate fi abruptă, mai ales dacă acesta este primul dvs. contact cu modelarea 3D. Dacă vă înpotmoliți într-un anumit moment, nu uitați că există o comunitate prietenoasă a utilizatorilor de pe forumul FreeCAD care ar putea să vă aducă în cel mai scurt timp pe linia de plutire.

Atelierul pe care îl veți utiliza în FreeCAD depinde de tipul de lucru pe care trebuie să-l faceți: Dacă intenționați să lucrați pe modele mecanice sau, mai general, la orice obiecte la scară redusă, probabil veți dori să încercați PartDesign Workbench. Dacă veți lucra în 2D, atunci veți comuta pe Draft Workbench, sau pe Sketcher Workbench dacă aveți nevoie de constrângeri. Dacă veți dori să faceți construcții civile, atunci lansați Arch Workbench. Dacă lucrați cu proiectarea navelor , există un atelier specializat pentru dvs Ship Workbench. Iar dacă veniți din lumea OpenSCAD, încercați atelierul OpenSCAD Workbench..

Puteți comuta atelirele în orice moment, și de asemenea customize atelierul favorit pentru a adăuga scule de la alte atelire.

Folosirea panourilor Proiectare componente (PartDesign) şi Schiţă

Atelierul PartDesign Workbench a fost creat special pentru a făuri obiecte complexe, pornind de la forme simple, prin adăugarea sau înlăturarea unor piese (pe care le numim "funcţii"), până la obţinerea obiectului în final. Toate funcţiile aplicate pe parcursul procesului de modelare sunt păstrate într-o mică fereastră numită Vizualizare Combo, care conţine şi celelalte obiecte din documentul Dvs. Practic, un obiect realizat cu "Proiectare componente" reprezintă o succesiune de operaţii, fiecare aplicată la lucrul produs în faza precedentă, astfel încât ele formează un lanţ prelung. În "Vizualizare Combo", vedeţi obiectul finalizat, dar el poate fi expandat astfel încât să-i regăsiţi toate stările precedente, să le modificaţi parametrii, schimbări care vor actualiza în mod automat aspectul final al obiectului.

Atelierul PartDesign utilizează intens un alt atelier de lucru, Sketcher Workbench. vă permite să desenați figuri 2D, care sunt definite prin aplicarea Constrângerilor la forma 2D. De exemplu, puteți trage un dreptunghi și puteți seta dimensiunea unei părți aplicând o constrângere de lungime pe una din laturi. Această parte nu mai poate fi redimensionată (cu excepția cazului în care constrângerea este modificată).

Aceste forme 2D realizate cu sketcher-ul sunt folosite foarte mult în bara de lucru PartDesign, de exemplu pentru a crea volume 3D sau pentru a desena zone pe fețele obiectului dvs. care vor fi apoi scoase din volumul principal. Acesta este un flux de lucru tipic PartDesign:

  1. Creați o schiță nouă
  2. Desenați o formă închisă (asigurați-vă că toate punctele sunt legate)
  3. Închideți schița
  4. Extindeți schița într-un solid 3D utilizând instrumentul de blocare
  5. Selectați o față a solidului
  6. Creați o a doua schiță (de data aceasta va fi desenată pe fața selectată)
  7. Desenați o formă închisă
  8. Închideți schița
  9. Creați un buzunar din a doua schiță, pe primul obiect

Care vă dă un obiect ca acesta:

Partdesign example.jpg

În orice moment, puteți selecta schițele originale și le puteți modifica sau puteți schimba parametrii de extrudare ai operațiilor de blocare sau buzunar, care vor actualiza obiectul final.

Lucrând cu atelierele Desen 2D și Arhitectură

Atelierele Draft Workbench și Arch Workbench se comporta un pic diferit fata de celelalte ateliere de mai sus, deși urmează aceleași reguli, care sunt comune tuturor FreeCAD-urilor. Pe scurt, în timp ce Sketcher și PartDesign sunt create în primul rând pentru a proiecta piese unice, Draft și Arch sunt făcute pentru a vă ușura munca atunci când lucrați cu mai multe obiecte mai simple.

Atelierul Draft Workbench vă oferă instrumente 2D cumva similare cu ceea ce puteți găsi în aplicațiile tradiționale 2D CAD cum ar fiAutoCAD. Totuși, desenarea 2D fiind departe de domeniul FreeCAD, nu vă așteptați să găsiți acolo o gamă completă de instrumente care oferă aceste aplicații dedicate. Majoritatea instrumentelor de proiectare funcționează nu numai într-un plan 2D, ci și în întreg spațiul 3D și beneficiază de sisteme speciale de ajutor, cum ar fi Work planes și object snapping.

Atelierul Arch Workbench adaugă BIM tools to FreeCAD, permițându-vă să construiți modele arhitecturale cu obiecte parametrice. Baza de lucru Arch se bazează extensiv pe alte module cum ar fi Draft și Sketcher. Toate instrumentele de proiectare sunt de asemenea prezente în Atelierul de lucru Arch și majoritatea instrumentelor Arch utilizează sistemele Helper desen 2D (Draft).

Un flux de lucru tipic cu atelierele de lucru Arch și Draft ar putea fi:

  1. Desenați câteva linii cu ajutorul instrumentului Draft Line
  2. Selectați fiecare linie și apăsați instrumentul Perete pentru a construi un perete pe fiecare dintre ele
  3. Alăturați pereții selectând-i și apăsând instrumentul Arch Add
  4. Creați un obiect tip pardoseală și mutați pereții în el din vizualizarea Arbore
  5. Creați un obiect construit și mutați podeaua în el din vizualizarea Arbore
  6. Creați o fereastră făcând clic pe instrumentul Fereastră, selectați o presetare în panoul său, apoi faceți clic pe o față a unui perete
  7. Adăugați cotele prin setarea inițială a planului de lucru, dacă este necesar, apoi utilizând instrumentul Draft Dimension

Ceea ce vă va aduce asta:

Arch workflow example.jpg

Mai mult în pagina Tutorials.

Script

Freecad, as an open source software, offers the possibility to supplement its workbenches with addons.

The Addon principle is based on the development of a workbench complement. Any user can develop a function that he or she deems to be missing for her/his own needs or, ultimately, for the community. With the forum, the user can request an opinion, help on the forum. It can share, or not, the object of its development according to copyright rules to define. Free to her/him. To develop, the user has available scripting functions.

There are two types of addons:

  1. Macros: short snippets of Python code that provide a new tool or functionality. Macros usually start as a way to simplify or automate the task of drawing or editing a particular object. If many of these macros are collected inside a directory, the entire directory may be distributed as a new workbench.
  2. External workbenches: collections of tools programmed in Python or C++ that extend FreeCAD in an important way. If a workbench is sufficiently developed and is well documented, it may be included as one of the base workbenches in FreeCAD. Under External workbenches, you'll find the principle and a list of existing library.

Scripting

Iar, la sfârşit, să remarcăm că una dintre cele mai puternice caracteristici ale FreeCAD este mediul creat de script-programare. De la consola integrata Python (sau oricare alt script extern Python) se poate controla aproape orice parte a programului, se pot crea si modifica geometrii, se poate modifica reprezentarea obiectelor in scena 3D sau accesa si modifica interfata FreeCAD. Script-urile Python pot fi folosite si in macroinstructiuni, ceea ce furnizeaza o metoda usoara de creare a comenzilor personalizate.

Ce e nou

Lucrul cu FreeCAD

Navigarea 3D

Modelul mouse-ului in FreeCAD este constituit din comenzi folosite la navigarea spațiului 3D și interacțiunea cu obiectele afișate. In versiunea actuală există trei moduri diferite de navigare. Modul implicit este numit "Navigare CAD" și este foarte simplu și practic, dar FreeCAD are două stiluri alternative modelate dupa navigarea în Inventor si Blender.

Navigarea

Modul de lucru cu obiecte este comun pentru toate paletele. Urmatoarele acțiuni cu mouse-ul pot fi folosite pentru controlul poziției si modului de vizualizare, în functie de stilul de navigare selectat.

Exista două moduri de a schimba stilul de navigare:

  • In dialogul pentru preferinte, secțiunea Afișare, tab-ul Vizualizare 3D;
  • Click-dreapta în spațiul liber în zona de vizualizare 3D, selectând Stil de navigare în meniul contextual.

Navigare CAD (implicita)

Acesta este modul de navigare implicit și permite utilizatorului un control simplu al vizualizării; nu este nevoie de folosirea tastaturii decât pentru selecție multiplă.

Selectare Translatie Zoom Rotire
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
pentru selectie pentru translatie pentru a mari sau micsora pentru a roti vizualizarea
Apasati butonul stanga al mouse-ului deasupra obiectului de selectat. Apasarea tastei CTRL permite selectarea mai multor obiecte. Apasati butonul din mijloc si miscati mouse-ul pentru a translata vizualizarea. Folositi rotita mouse-ului pentru a mari sau micsora. Apasati mai intai butonul din mijloc al mouse-ului, tineti-l apasat si apasati butonul stanga al mouse-ului si mutati-l in directia dorita. Functioneaza ca o bila ce se roteste in jurul centrului. Daca eliberati butoanele inainte de a inceta miscarea vizualizarea va continua sa se roteascain jurul centrului, daca aceasta caracteristica e activata. Dublu-click folosind butonul mijlociu pe oricare parte a unui obiect seteaza noul centru de rotatie si panorameaza pe acest punct.


Select Pan Zoom Rotate view
First method
Rotate view
Alternate method
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png Rotate cursor.png
Mouse LMB.svg Mouse MMB hold.svg Mouse MMB rotate.svg Mouse MMB+LMB hold.svg Mouse MMB+RMB hold.svg
Press the left mouse button over an object you want to select.

Holding down Ctrl allows the selection of multiple objects.

Hold the middle mouse button, then move the pointer. Use the mouse wheel to zoom in and out.

Clicking the middle mouse button re-centers the view on the location of the cursor.

Hold the middle mouse button, then press and hold the left mouse button, then move the pointer.

The cursor location when the middle mouse button is pressed determines the center of rotation. Rotation works like spinning a ball which rotates around its center. If the buttons are released before you stop the mouse motion, the view continues spinning, if this is enabled.

A double click with the middle mouse button sets a new center of rotation.

Hold the middle mouse button, then press and hold the right mouse button, then move the pointer.

With this method the middle mouse button may be released after the right mouse button is held pressed.

Users who use the mouse with their right hand may find this method easier than the first method.

Ctrl+Mouse RMB.svg Ctrl+Shift+Mouse RMB.svg Shift+Mouse RMB.svg
Pan mode: hold the Ctrl key, press the right mouse button once, then move the pointer. introduced in version 0.17 Zoom mode: hold the Ctrl and Shift keys, press the right mouse button once, then move the pointer. introduced in version 0.17 Rotate mode: hold the Shift key, press the right mouse button once, then move the pointer. introduced in version 0.17
Select Pan Zoom Rotate view
First method
Rotate view
Alternate method
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png Rotate cursor.png
Mouse LMB.svg Mouse MMB hold.svg Mouse MMB rotate.svg Mouse MMB+LMB hold.svg Mouse MMB+RMB hold.svg
Press the left mouse button over an object you want to select.

Holding down Ctrl allows the selection of multiple objects.

Hold the middle mouse button, then move the pointer. Use the mouse wheel to zoom in and out.

Clicking the middle mouse button re-centers the view on the location of the cursor.

Hold the middle mouse button, then press and hold the left mouse button, then move the pointer.

The cursor location when the middle mouse button is pressed determines the center of rotation. Rotation works like spinning a ball which rotates around its center. If the buttons are released before you stop the mouse motion, the view continues spinning, if this is enabled.

A double click with the middle mouse button sets a new center of rotation.

Hold the middle mouse button, then press and hold the right mouse button, then move the pointer.

With this method the middle mouse button may be released after the right mouse button is held pressed.

Users who use the mouse with their right hand may find this method easier than the first method.

Ctrl+Mouse RMB.svg Ctrl+Shift+Mouse RMB.svg Shift+Mouse RMB.svg
Pan mode: hold the Ctrl key, press the right mouse button once, then move the pointer. introduced in version 0.17 Zoom mode: hold the Ctrl and Shift keys, press the right mouse button once, then move the pointer. introduced in version 0.17 Rotate mode: hold the Shift key, press the right mouse button once, then move the pointer. introduced in version 0.17


Navigare Tip Inventor

In acest tip de navigare modelată după Open Inventor (a nu se confunda cu Autodesk Inventor) nu exista selectie cu mouse-ul. Pentru selectare trebuie apasată tasta CTRL.

Selectare Translatie Zoom Rotire
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
ctrl +pentru selectare pentru translatie pentru marire sau micsorare sau pentru marire sau micsorare pentru a roti
Tineti CTRL apasat si apasati butonul stanga al mouse-ului deasupra unui obiect ce doriti sa fie selectat. Faceti click cu butonul stanga al mouse-ului si miscati obiectul. Folositi rotita mouse-ului pentru marire si micsorare sau apasati si tinei butonul din mijloc si apasati butonul din stnga. Faceti click si trageti folosind butonul stanga al mouse-ului pentru a roti


Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Ctrl+Mouse LMB.svg Mouse MMB hold.svg Mouse MMB rotate.svg Mouse MMB+LMB hold.svg Mouse LMB hold.svg
Hold Ctrl, then press the left mouse button over an object you want to select. Hold the middle mouse button, then move the pointer. Use the mouse wheel to zoom in and out.

Alternatively, hold the middle mouse button, then press and hold the left mouse button, then move the pointer.

Hold the left mouse button, then move the pointer.

This mode is not based on Autodesk Inventor.

Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Ctrl+Mouse LMB.svg Mouse MMB hold.svg Mouse MMB rotate.svg Mouse MMB+LMB hold.svg Mouse LMB hold.svg
Hold Ctrl, then press the left mouse button over an object you want to select. Hold the middle mouse button, then move the pointer. Use the mouse wheel to zoom in and out.

Alternatively, hold the middle mouse button, then press and hold the left mouse button, then move the pointer.

Hold the left mouse button, then move the pointer.


Navigare Tip Blender

Blender Navigation a fost modelat după Blender. Anterior nu a existat o panoramare cu mouse-ul și a fost necesară utilizarea tastei SHIFT pentru a panorama vederea. Acest lucru s-a schimbat în 2016, cu o adăugare de caracteristici. Pentru a panorama vizualizarea, puteți apăsa acum butoanele mouse-ului stânga și dreapta și trageți în vizualizare.

Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Mouse LMB.svg Shift+Mouse MMB hold.svg Mouse LMB+RMB hold.svg Mouse MMB rotate.svg Mouse MMB hold.svg
Press the left mouse button over an object you want to select. Hold Shift and the middle mouse button, then move the pointer.

Alternatively, hold both left and right mouse buttons, and then move the pointer.

Use the mouse wheel to zoom in and out. Hold the middle mouse button, then move the pointer.

Alternatively, hold both left and right mouse buttons, and then move the pointer. |Zoom_text=Use the mouse wheel to zoom in and out. |Rotate_view_text=Hold the middle mouse button, then move the pointer. }}

Navigarea cu Touchpad-ul

În Navigatorul cu touchpad, nici panningul, nici zoom-ul, nici rotirea vizualizării nu sunt operații numai pentru mouse (sau doar touchpad).

Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Touchpad LB.svg Shift+Touchpad.svg PageUp, PageDown Alt+Touchpad.svg
Press the left mouse button over an object you want to select. Hold Shift, then move the pointer. Use PageUp and PageDown to zoom in and out. Hold Alt, then move the pointer.
Shift+Ctrl+Touchpad.svg Shift+Touchpad LB hold.svg
Alternatively, hold Shift and Ctrl, then move the pointer. Alternatively, hold Shift and the left button, then move the pointer.

Navigarea prin Gesturi(v0.16)

Acest stil de navigare a fost adaptat pentru utilizarea cu touchscreen și stiloul, dar este foarte ușor de utilizat cu mouse-ul.

Select Pan Zoom Rotate view Tilt view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png Rotate cursor.png
Mouse LMB.svg Mouse RMB hold.svg Mouse MMB rotate.svg Mouse LMB hold.svg Mouse LMB+RMB hold.svg
Press the left mouse button over an object you want to select. Hold the right mouse button, then move the pointer. Use the mouse wheel to zoom in and out. Hold the left mouse button, then move the pointer.

In Sketcher and other edit modes, this behavior is disabled. Hold Alt when pressing the mouse button to enter rotation mode.

To set the camera's focus point for rotation, click a point with the middle mouse button. Alternatively, aim the cursor at a point and press H on the keyboard.

Hold both left and right mouse buttons, and then move the pointer sideways.
Touch Tap.svg Touch Two-Finger-Drag.svg Touch Tap-Hold-Drag.svg Touch Pinch.svg Touch One-Finger-Drag.svg Touch Rotate.svg
Tap to select. Drag with two fingers.

Alternatively, tap and hold, then drag. This simulates the pan with the right mouse button.

Drag two fingers (pinch) closer or farther apart. Drag with one finger to rotate.

Hold Alt when in the Sketcher.

Rotate the imaginary line formed by two touch points.

On v0.18 this method is disabled by default. To enable, go to Edit → Preferences → Display, and untick "Disable touchscreen tilt gesture" checkbox.

Alternatively, tap and hold, then drag. This simulates the pan with the right mouse button. |Zoom_text=Use the mouse wheel to zoom in and out. |Zoom_gesture_text=Drag two fingers (pinch) closer or farther apart. |Rotate_view_text=Hold the left mouse button, then move the pointer. In Sketcher and other edit modes, this behavior is disabled. Hold Alt when pressing the mouse button to enter rotation mode.

To set the camera's focus point for rotation, click a point with the middle mouse button. Alternatively, aim the cursor at a point and press H on the keyboard. |Rotate_view_gesture_text=Drag with one finger to rotate.

Hold Alt when in the Sketcher. |Tilt_view_text=Hold both left and right mouse buttons, then move the pointer sideways. |Tilt_view_gesture_text=Rotate the imaginary line formed by two touch points.

On v0.18 this method is disabled by default. To enable, go to Edit → Preferences → Display, and untick "Disable touchscreen tilt gesture" checkbox. }}

Navigare tip Maya

În navigația Maya-Gesture, toate mișcările de vizualizare sunt activate prin apăsarea butonului ALT și a butonului mouse-ului, astfel încât să fie necesar un mouse cu 3 butoane pentru a utiliza corect acest mod de navigare. Alternativ, este posibil să utilizați gesturi, deoarece acest mod a fost dezvoltat în modul normal de navigare prin gesturi.

Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Mouse LMB.svg Alt+Mouse MMB hold.svg Alt+Mouse RMB hold.svg Mouse MMB rotate.svg Alt+Mouse LMB hold.svg
Press the left mouse button over an object you want to select. Hold Alt and the middle mouse button, then move the pointer. Hold Alt and the right mouse button, then move the pointer.

Alternatively, use the mouse wheel to zoom in and out.

Hold Alt and the left mouse button, then move the pointer.

Alternatively, use the mouse wheel to zoom in and out. |Rotate_view_text=Hold Alt and the left mouse button, then move the pointer. }}


Revit Navigation

This style was introduced in version 0.18.

Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Mouse LMB.svg Mouse MMB hold.svg Mouse LMB+RMB hold.svg Mouse MMB rotate.svg Shift+Mouse MMB hold.svg Mouse MMB+RMB hold.svg


Press the left mouse button over an object you want to select. Hold the middle mouse button, then move the pointer.

Alternatively, hold both left and right mouse buttons, then move the pointer.

Use the mouse wheel to zoom in and out. Hold Shift and the middle mouse button, then move the pointer.

Alternatively, hold the middle mouse button, then press and hold the right mouse button, then move the pointer.


OpenCascade

This style was introduced in version 0.18.

Select Pan Zoom Rotate view
Hand cursor.png Pan cursor.png Zoom cursor.png Rotate cursor.png
Mouse LMB.svg Ctrl+Mouse MMB hold.svg Mouse MMB hold.svg Mouse MMB rotate.svg Ctrl+Mouse LMB hold.svg Ctrl+Mouse RMB hold.svg


Press the left mouse button over an object you want to select. Hold the middle mouse button, then move the pointer. Use the mouse wheel to zoom in and out.

Alternatively, hold Ctrl and the left mouse button, then move the pointer.

Hold Ctrl and the right mouse button, then move the pointer.


Selectarea Obiectelor

Selecția Simplă

Obiectele se selectează cu click-stânga în vizualizarea 3D sau selectare în vizualizarea arborescentă.

Preselecție

Există, de asemenea, și un mecanism de preselecție care evidențiază obiectele și prezintă informații despre ele înainte de a fi selectate, doar prin mișcarea mouse-ului deasupra lor. Dacă nu agreați acest comportament sau calculatorul este lent puteți să-l suprimați din dialogul pentru preferințe.

Manipularea Obiectelor

FreeCAD oferă manipulatori ce pot fi folosiți pentru a schimba aparența sau proprietățile obiectului.

Un exemplu simplu este planul de secționare ce poate fi activat folosind meniul Vizualizare→Plan de secționre.

Suport Hardware

FreeCAD suportă și un număr de dispozitive 3D.

Probleme la Mac OS X

Recent am primit rapoarte pe forum de la utilizatorii de Mac la care acele combinații de taste și butoane de mouse nu funcționează conform așteptărilor. Din păcate, niciunul dintre dezvoltatori nu deține un Mac, nici ceilalți contributori obișnuiți. Avem nevoie de ajutorul tău pentru a determina ce butoane și combinații de taste ale mouse-ului funcționează astfel încât să putem actualiza acest

Documentul în FreeCAD

Screenshot treeview.jpg

Un document FreeCAD conține toate obiectele din scenă. Poate conține grupuri și obiecte realizate cu oricare atelier.Ca urmare atelierele pot fi schimbate fără a părăsi documentul. Conținutul documentului este cel salvat pe disc. Mai multe documente pot fi deschise în acelasi timp și mai multe vizualizări al aceluiași document pot fi deschise în același timp.

In ineriorul documentului obiectele pot fi mutate in grupuri si au un nume unic. Administrarea obiectelor, a grupurilor de obiecte si a numelor obiectelor se face in primul rand dn vizualizarea arborescenta. Toate acestea pot fi realizate ca orice altceva in FreeCAD, folosind script-uri Python. In vizualizarea arborescenta se pot crea grupuri, muta obiecte in grupuri, sterge obiecte sau grupuri folosind meniul contextual (click dreapta cu mouse-ul). Redenumirea obiectelor se face cu dublu-click pe obiect. Este posibil sa existe si alte actiuni permise in functie de tipul obiectului si paleta curenta.

Obiectele din documentul FreeCAD pot avea diferite tipuri. Fiecare atelier poate crea propriile tipuri de obiecte, de exemplu Atelierul Plase creează obiecte plasă, atelierul |atelierul Piese poate crea piese, Atelierul desen2D poate crea și el piese, etc.

Daca este cel putin un document deschis in FreeCAD, atunci exact un document este activ. Acesta este documentul care apare in vizualizarea 3D curenta, documentul cu care lucrati in mod curent.

Aplicatia si Interfata cu Utilizatorul

Ca orice altceva in FreeCAD, partea de interfața grafică a utilizatorului (GUI) este separată de partea de aplicație (App). Acest lucru este adevărat și pentru documente. Acestea sunt și ele alcătuite din două părți: partea de aplicație, ce conține obiecte, și partea de vizualizare, ce conține reprezentarea grafica a obiectelor.

Gândiți-vă la aceasta arhitectură ca la două spații unde obiectele sunt definite. Parametrii constructivi (este un cub? un con? ce dimensiuni are?) sunt stocați in partea de App, pe când reprezentarea grafică (liniile au culoarea neagră? fațetele sunt albastre?) este stocată în partea GUI. De ce aceasta separare? Pentru că FreeCAD poate fi folosit și without

fără interfața grafică, de exemplu în interiorul altor programe, și trebuie să putem manipula obiectele chiar dacă nimic nu este desenat pe ecran.

O alta parte ce este stocată în partea de grafică sunt vizualizările 3D. Un document poate avea mai multe vizualizări deschise în același timp astfel ca să puteți examina conținutul documentului din mai multe puncte de vedere în același timp. Poate doriți să vedeți în același timp imaginea de sus și din față în același timp? In acest caz trebuie să folosiți două vizualizări stocate în partea grafică ce pot fi create în meniul Vizualizare sau prin click-dreapta pe un tab de vizualizare.

Scripturi

Documentele pot fi ușor create, accesate și modificate de la interpretorul Python . De exemplu:

FreeCAD.ActiveDocument

O sa dea documentul curent

FreeCAD.ActiveDocument.Blob

O sa acceseze un document numit "Blob" inauntrul documentului activ

FreeCADGui.ActiveDocument

O sa dea partea grafica asociata cu documentul activ

FreeCADGui.ActiveDocument.Blob

O sa acceseze partea grafica a obiectului "Blob"

FreeCADGui.ActiveDocument.ActiveView

O sa dea vizualizarea activa

Arrow-left.svg Mouse Model Anteriorul:

Definirea preferințelor utilizatorului

Dialogul de editare a preferintelor se poate activa folosind meniul Edit menu → Preferences.

Functionalitatea FreeCAD este impartita in diverse module, fiecare modul fiind responsabil pentru functionarea unei anumite palete. Aplicatia foloseste o tehnica numita incarcare intarziata, ceea ce inseamna ca incarcarea componentelor are loc doar atuni cand e nevoie efectiv de ele. Poate ati observat ca atunci cand selectati o paleta din bara de unelte, acea paleta si toate componentele asociate cu ea sunt incarcate in acel moment. Aceasta include si preferintele in dialogul de editare.

Fără nici un modul încărcat veți avea acces la secțiunile de configurare responsabile pentru setări generale ale aplicației și ale afișării.

Dacă faceți clic pe butonul Reset din colțul din stânga jos al oricărui afișaj de preferințe, setați all din preferințele FreeCAD la valorile lor implicite.

Preferințe generale

Cand porniți FreeCAD fără nici un atelier încărcat veți avea un numar minim de preferințe de editat. Pe măsura ce încărcați module adiționale, secțiuni noi apar în fereastra de dialog, permițând configurarea parametrilor atelierelor încărcate.

General

In the General tab you can specify the following:

Name Description
Change language Select the language of FreeCAD's user interface
Size of recent file list Specification how many files should be listed in the recent files list
Enable tiled background If checked, the background of FreeCAD's main window will by default consist of tiles of this image: Background.png

This option only has an effect if in Style sheet/No style sheet is selected.

The image can be changed by adding the folders Gui/Images in the folder

%APPDATA%/FreeCAD (on Windows),

$HOME/.FreeCAD (on Linux) or

$HOME/Library/Preferences/FreeCAD (on MacOS).

Put there a file named background.png and uncheck/check this option to see the changed file.

Style sheet Selection of a style sheet. The style sheets define how the user interface of FreeCAD looks.
Size of toolbar icons Selection of the size for the toolbar icons
Auto load module after start up Selection what workbench will be used directly after starting FreeCAD
Enable splash screen at start up If checked, the splash screen of FreeCAD is shown when starting.

The splash screen image can be changed by adding the folders Gui/Images in the folder %APPDATA%/FreeCAD (where %APPDATA% is the the user-specific application folder of FreeCAD of your operating system). Put there a file named splash_image.png and restart FreeCAD to see the changed splash screen.

Enable word wrap Words will be wrapped when they exceed the available horizontal space in the Python console. This console is shown using the menu View → Panels → Python console.
Preference General Tab 01.png

Document

In the Document tab you can specify the following:

Name Description
Create new document at start up If checked, FreeCAD will create a new document when started
Document save compression level Specification of the compression level for FCStd files. FCStd files are ZIP-compressed files. Therefore you can rename their suffix .FCStd to .zip and open them with a ZIP archive program.
Using Undo/Redo on documents If checked, all changes in documents are stored so that they can be undone/redone
Maximum Undo/Redo steps Specification how many Undo/Redo steps should be recorded
Run AutoRecovery at startup If there is a recovery file available FreeCAD will automatically run a file recovery when it is started. This way files can be restored if a crash occurred.
Save AutoRecovery information every Specification how often a recovery file is written.
Save thumbnail into project file when saving document If checked, also a thumbnail will be stored when the document is saved. The thumbnail will for example be shown in the list of recent files in the Start workbench.
Add the program logo to the generated thumbnail If checked, the FreeCAD program logo FreeCAD-logo.svg will be added to the thumbnail. This option only has an effect if Save thumbnail into project file when saving document is used.
Maximum number of backup files to keep when resaving document If checked, backup files will be kept when saving the document. You can specify how many backup files will be kept. They contain the previously saved document version. The first backup file will have the file suffix .FCStd1, the second .FCStd2 and so on.
Allow duplicate object labels in one document If checked, objects can have the same label/name. For example different parts or features can then have the same name in the same document.
Author name All documents that will be created will get the specified author name. Keep the author field blank for an anonymous author. If the option Set on save is checked, the field Last modified by will be set to the specified author when saving the file. This field can be viewed using the menu File → Project information.
Company All documents that will be created will get the specified company name
Default license Selection of a default license for new documents. For predefined license the License URL will automatically be set accordingly. Select 'Other' for an own or special license.
License URL Specification of an URL describing the license selected in Default license
Preference General Tab 02.png

Editor

The editor preferences settings affect the behavior of the macro editor. This editor can be opened using the menu Macro → Macros... → Edit/Create.

The color and font settings also affect the Python console. This console is shown using the menu View → Panels → Python console.

In the Editor tab you can specify the following:

Name Description
Display Items Selection of the code type. The color and font settings will be applied to the selected type. The result can be seen in the Preview field.
Family Specification of the font family that should be used for the selected code type
Size Specification of the font size that should be used for the selected code type
Enable line numbers If checked, the code lines will be numbered
Tab size Specification of the tabulator raster (how many spaces). If it is for example set to '6', pressing Tab will jump to character 7 or 13 or 19 etc., depending the current cursor position. This setting is only used if Keep tabs is selected.
Indent size Specification of how many spaces will be inserted when pressing Tab. This setting is only used if Insert spaces is selected.
Keep tabs If selected, pressing Tab will insert a tabulator with the raster defined by Tab size
Insert spaces If selected, pressing Tab will insert the amount of spaces defined by Indent size
Preference General Tab 03.png

Fereastra de ieșire

The output preferences affect the behavior of the Report view.

In the Output tab you can specify the following:

Name Description
Record log messages If checked, also log messages will be recorded. They will be output in the Report view panel with the color set in Log messages. This panel is shown using the menu View → Panels → Report view.
Record warnings If checked, warnings will be recorded. They will be output in the Report view panel with the color set in Warnings.
Record error messages If checked, error messages will be recorded. They will be output in the Report view panel with the color set in Errors
Normal messages Specification of the font color for normal messages in the Report view panel.
Log messages Specification of the font color for log messages in the Report view panel.
Warnings Specification of the font color for warning messages in the Report view panel.
Errors Specification of the font color for error messages in the Report view panel.
Redirect internal Python output to report view If checked, internal Python output will be redirected from the Python console to the Report view panel. The Python console is shown using the menu View → Panels → Python console
Redirect internal Python errors to report view If checked, internal Python error messages will be redirected from the Python console to the Report view panel.
Preference General Tab 04.png

Macro

These options control certain aspects of running macros.

In the Macro tab you can specify the following:

Name Description
Run macros in local environment If checked, variables defined by macros are created as local variables, otherwise as global Python variable
Macro path Specification of a path to macro files
Recording GUI commands If checked, recorded macros will also contain user interface commands
Record as comment If checked, recorded macros will also contain user interface commands but as comments. This is useful if you don't want to execute visible actions when running the macro but to see what could be done visibly.
Show script commands in python console If checked, the commands executed by the macro scripts are shown in the Python console. This console is shown using the menu View → Panels → Python console.
Preference General Tab 05.png

Unități

This tab configures how Units are shown.

In the Units tab you can specify the following:

Name Description
User system Selection of a unit system that should be used for all parts of FreeCAD
Number of decimals The number of decimals that should be shown for numbers and dimensions in FreeCAD
Minimum fractional inch Minimum fractional inch that should be displayed. This setting is only available if the unit system Building US (ft-in/sqft/cuft) is used.
Preference General Tab 06.png

Setările afișajului

This preferences section has two general tabs, 3D View and Colors, and further tabs depending in the used workbenches.

3D View

This tab is always available, and controls certain characteristics of the 3D view.

In the 3D View tab you can specify the following:

Name Description
Show coordinate system in the corner If checked, the main coordinate system will always be shown at the lower right in opened files
Show counter of frames per second If checked, the time needed for the last operation and the resulting frame rate will always be shown at the lower left in opened files
Show navigation cube If checked, the navigation cube will always be shown at the selected Corner in opened files
Use OpenGL Vertex Buffer Object If checked, Vertex Buffer Objects (VBO) will be used. A VBO is an OpenGL feature that provides methods for uploading vertex data (position, normal vector, color, etc.) to the graphics card. VBOs offer substantial performance gains because the data resides in the graphics memory rather than the system memory and so it can be rendered directly by GPU. For more background info see this webpage.
Render Cache introduced in version 0.19 "Render Cache" or "Render Acceleration" is explained in more detail in Link#render-caching. There are 3 options:
  • Auto (default), let Coin3D decide where to cache.
  • Distributed, manually turn on cache for all view provider root nodes.
  • Centralized, manually turn off cache in all nodes of all view providers, and only cache at the scene graph root node. This offers the fastest rendering speed, but slower response to any scene changes.
Enable animation If checked, rotations can be animated. If for example the 3D Navigation set CAD is used and the mouse is moved while the scroll wheel and the right mouse button is pressed, parts are rotated. If one keeps the mouse moving while releasing e.g. the right mouse button, the rotation will continue as animation. To end the animation left-click with the mouse.
3D Navigation Selection of a navigation settings set. To see what each set defines, select a set and press the button Mouse....
Orbit style Selection of the rotation orbit style. When viewing a part in the x-y plane an being in the rotation mode of the 3D navigation, the difference is: If Trackball is selected, moving the mouse horizontally will rotate the part around the y-axis, if Turntable is selected the part will be rotated around the z-axis.
Anti-Aliasing Selection if and what kind of multisample anti-aliasing is used
New Document Camera Orientation Selection of the camera orientation for new documents
New Document Scale Affects the initial "zoom level" of camera for new documents. The value you set is the diameter of a sphere that fits in 3D view. Default is 100 mm, convenient for objects like boxes for Arduino. It also sets initial size of origin features (base planes in a new PartDesign Body).
Zoom at cursor If checked, zoom operations will be performed at the position of the mouse pointer. Otherwise zoom operations will be performed at the center of the current view. The Zoom step defines how much will be zoomed. A zoom step of '1' means a factor of 7.5 for every zoom step.
Invert zoom If checked, the direction of zoom operations will be inverted.
Disable touchscreen tilt gesture If checked, the tilting gesture will be disabled for pinch-zooming (two-finger zooming). This only affects the 3D Navigation set Gesture.
Drag at cursor If checked, rotations in 3D will use the current cursor position as center for the rotation. Otherwise always the center of the screen will be used.
Marker size Selection of the size of vertices (points) in the Sketcher workbench. The clickable area of points can be additionally enlarged by increasing Pick radius (on Colors tab).
Eye to eye distance for stereo modes Specification of the eye-to-eye distance used for stereo projections. The specified value is a factor that will be multiplied with the bounding box size of the 3D object that is currently displayed.
Enable backlight color If checked, backlight is enabled with the defined color. Backlight is used for rendering back sides of faces (usually, you don't see them in solids, unless you slice one with a clipping plane, or if the faces aren't oriented correctly). It is only active for objects whose Lighting property (on View tab) is set to "One side". If disabled, back sides of faces of objects in "One side" lighting mode will be black.
Intensity of backlight Specification of the intensity of the backlight. This setting is only enabled if Enable backlight color is checked.
Camera type Selection of the camera projection type.
Preference Display Tab 01.png

Colorate

This tab is always available.

In the Colors tab you can specify the following:

Name Description
Enable preselection highlighting If checked, preselection is turned on and will be highlighted by the specified color. Preselection means that for example edges in parts will be highlighted while hovering with the mouse over them to indicate that they can be selected.
Enable selection highlighting If checked, selection highlighting is turned on and the specified color will be used for it
Pick radius Sets the area for picking elements in 3D view. Larger value makes it easier to pick things, but can make some small features impossible to select.
Simple color If selected, the background for parts will have the selected color
Color gradient If selected, the background for parts will have the selected color gradient
Middle color Is only enabled if Color gradient is selected. If checked, the color gradient will get the selected color as middle color.
Object being edited Selection of the background color for objects in the tree view that are currently edited
Active container Selection of the background color for active containers in the tree view. For example if there are several parts in the tree view and one part is toggled as active body, it will get the selected background color in the tree view.
Preference Display Tab 02.png

Culoare parte

This tab is only shown if you are in the Part or PartDesign Workbench or if you have been in these workbenches before.

In the Part colors tab you can specify the following:

Name Description
Default shape color Selection of the default color for new shapes. If the option Random shape color is set, a random color is used instead.
Default line color Selection of the default line color for new shapes
Default line width Specification of the default line thickness for new shapes
Default vertex color Selection of the default color for new vertices
Default vertex size Specification of the default size for new vertices
Bounding box color Selection of the color of bounding boxes in the 3D view
Default text color Selection of the default text color for document annotations. There is currently no dialog to add annotations to documents. Annotations can only be added using the Python console with this command:

obj=App.ActiveDocument.addObject("App::Annotation", "Label")

This console is shown using the menu View → Panels → Python console.

Preference Display Tab 03.png

Mesh view

This tab is only shown if you are in the Mesh Workbench or if you have been in this workbench before.

In the Mesh view tab you can specify the following:

Name Description
Default mesh color Selection of the default color for new meshes
Default line color Selection of the default line color for new meshes
Mesh transparency Specification of the default mesh transparency for new meshes
Line transparency Specification of the default line transparency for new meshes
Two-side rendering If checked, the bottom side of the surface will be rendered the same way than the top side. If not checked, it depends on the option Enable backlight color (see section 3D view). Either the backlight color will be used or black.
Show bounding-box for highlighted or selected meshes If checked, a yellow bounding box will be displayed for highlighted or selected meshes.
Define normal per vertex If checked, Phong shading is used, otherwise flat shading. Shading defines the appearance of surfaces.

With flat shading the surface normals are not defined per vertex that leads to a unreal appearance for curved surfaces while using Phong shading leads to a smoother appearance.

Crease angle The crease angle is a threshold angle between two faces. It can only be set if the option Define normal per vertex is used.
If face angle ≥ crease angle, facet shading is used
If face angle < crease angle, smooth shading is used

Mesh View Preferences.png

Import-Export settings

The Import-Export settings affect how files are imported and exported to and from FreeCAD. They are described in the page Import Export Preference.

Workbench preferences

Preferences for the more common workbenches are linked below. Some workbenches have no preferences. Other optional workbenches may not be listed.

Modulul de schiță are ecranul său preferințe

External workbenches

Personalizarea interfeței

Deoarece interfaţa FreeCAD se bazează pe setul de unelte moderne din bibliotecile Qt, ea beneficiază de o structurare avansată. Ferestrele, meniurile, barele de unelte şi alte instrumente pot fi modificate, mutate, distribuite intre panouri, scurtaturile pot fi personalizate si macroinstructiunile pot fi inregistrate si redate. Fereastra de personalizare se acceseaza din meniul Tools -> Customize

Screenshot-customize.jpg

Tab-uri de personalizare

Tab-ul Comenzi permite afişarea tuturor comenzilor FreeCAD, organizate pe categorii.

În Tastatură puteţi vedea combinaţiile de taste asociate cu fiecare comandă FreeCAD şi, dacă doriţi, le puteţi modifica sau să asociaţi noi taste rapide pentru oricare dintre comenzi. Aici trebuie să intraţi dacă utilizaţi adesea un anumit panou şi doriţi să creşteţi viteza de lucru prin folosirea scurtăturilor.

Tab-urile Bare de unelte şi Barele cutii cu unelte vă permit modificarea barelor de unelte existente ori crearea unora proprii.

Tab-ul Macro-uri permite gestionarea acestora.

Creaţi-vă propriile Bare de unelte pentru gestionarea macrocomenzilor nou-create.

De la Versiunea 0.16 se oferă o nouă unealtă care vă permite să gestionaţi propriile ateliere.

CustomizeWorkbenches.png

Example

Drept exemplu pentru un flux de operaţii, să presupunem că dorim ca unealta pentru măsurători liniare Ruletă să apară într-o bară personalizată de unelte din atelierul Draft Workbench.

  • În FreeCAD, alegeţi "Instrumente -> Personalizare" din meniul de sus
  • selectaţi tab-ul "Bare de instrumente"
  • în partea stângă, derulaţi meniul de sus în jos şi alegeţi "Componentă" (Part)
  • în fereastra de jos din stânga, derulaţi până la opţiunea "Ruletă̝" şi selectaţi-o.
  • în jumătatea dreaptă, alegeţi "Ciornă (Draft) din meniul cu desfăşurare în jos
  • daţi clic pe butonul New... ca să creaţi o bară nouă de unelte şi daţi-i un nume
  • în fereastra din dreapta jos, selectaţi ca destinaţie propria bară de unelte (aceasta doar dacă aveţi mai multe bare)
  • daţi clic pe butonul "Săgeată albastră către dreapta" (aflat deasupra celor din spaţiul central) şi veţi adăuga opţiunea dorită în bara selecţionată

De remarcat

Când selectaţi "Global" în meniul cu derulare în jos din dreapta, veţi crea o bară de unelte vizibilă în toate panourile

Ca să adăugaţi o macrocomandă existentă într-o bară de unelte, trebuie:

  • să selectaţi "Macro-uri" în meniul cu derulare în jos din stânga
  • să alegeţi textul din meniu, o iconiţă (Pixmap) şi folosiţi în continuare meniul "Instrumente -> Personalizare -> Macro-uri"

Proprietățile obiectelor

A property is a piece of information like a number or a text string that is attached to a FreeCAD document or an object in a document. Properties can be viewed and modified with the Property editor.

Properties play a very important part in FreeCAD, since it has been designed to work with parametric objects, which are objects defined only by their properties.

Custom scripted objects in FreeCAD can have properties of the following types:

Boolean
 Float
 FloatList
 FloatConstraint
 Angle
 Distance
 Integer
 IntegerConstraint
 Percent
 Enumeration
 IntegerList
 String
 StringList
 Link
 LinkList
 Matrix
 Vector
 VectorList
 Placement
 PlacementLink
 Color
 ColorList
 Material
 Path
 File
 FileIncluded
 PartShape
 FilletContour
 Circle

Lucrul cu ateliere

FreeCAD, la fel ca multe aplicații de design moderne, precum Revit sau CATIA, se bazează pe conceptul de Workbench. Un atelier poate fi considerat un set de instrumente special grupate pentru o anumită sarcină. Într-un atelier de mobilier tradițional, veți avea o masă de lucru pentru persoana care lucrează cu lemn, un altul pentru cel care lucrează cu piese de metal și poate un al treilea pentru tipul care montează toate piesele împreună.

În FreeCAD, se aplică același concept. Instrumentele sunt grupate în ateliere în funcție de sarcinile cu care sunt legate.

Când treceți de la un atelier la altul, se schimbă instrumentele disponibile pe interfață. Barele de instrumente, barele de comandă și, eventual, alte părți ale interfeței comută la noul tabel de lucru, dar conținutul scenei dvs. nu se schimbă. Ați putea, de exemplu, să începeți desenarea unor forme 2D cu Workbench Draft, apoi să lucrați mai departe pe ele cu Workbench Part.

Rețineți că uneori un Workbench este denumit "Modul". Cu toate acestea, atelierele de lucru și modulele sunt entități diferite. Un modul este orice extensie a FreeCAD, în timp ce un Workbench este o configurație GUI specială care grupează câteva bare de instrumente și meniuri. De obicei, fiecare modul conține propriul său Workbench, de unde și utilizarea încrucișată a numelui.

Ateliere încorporate

Următoarele ateliere sunt disponibile pentru fiecare instalare FreeCAD:

  • Freecad16.svg Std Base. This is not really a workbench, but this category serves to collect all "standard" commands and tools of the system which can be used in all workbenches.
  • Workbench Arch.svg Arch Workbench pentru lucrul cu elementele arhitecturale.
  • Workbench Complete.svg Complete Workbench deține toate comenzile și caracteristicile din toate modulele și atelierele care au îndeplinit anumite criterii de calitate. Deprecated in v0.17
  • Workbench Draft.svg Draft Workbench conține instrumente 2D și operații CAD 2D și 3D de bază.
  • Workbench Drawing.svg Modul Desen de lucru pentru afișarea lucrării dvs. 3D pe o foaie 2D.
  • Workbench FEM.svg FEM Workbench/ro oferă fluxul de lucru FEA (Analiza Elementului Finit).
  • Workbench Reverse Engineering.svg Reverse Engineering Workbench este destinat să vă ofere instrumente specifice pentru a transforma forme / solide / plase în parametrii compatibili cu FreeCAD. Este încă în dezvoltare.
  • Workbench Robot.svg Robot Workbench pentru a studia mișcările robotului.
  • Workbench Ship.svg Navele FreeCAD Ship Workbench lucrează peste entitățile navei, care trebuie să fie create peste geometria furnizată.
  • Workbench Sketcher.svg Sketcher Workbench pentru a lucra cu schițe constrânse prin geometrie.
  • Workbench Spreadsheet.svg Foile de calcul tabelar pentru crearea și manipularea datelor din foaia de calcul.

Deprecated

The following workbenches are still included in the base installation for compatibility purposes, but they should no longer be used.

Ateliere externe

Atelierele de lucru FreeCAD sunt ușor de programat în Python, prin urmare, mulți oameni dezvoltă ateliere suplimentare în afara grupului principal de dezvoltatori FreeCAD.

Pagina external workbenches conține câteva informații și tutoriale despre unele dintre ele, iar proiectul FreeCAD Addons are ca scop colectarea acestora și facilitarea instalării acestora în cadrul FreeCAD .

Noi ateliere sunt în curs de dezvoltare, fiți pe recepție!

Lucrul cu ochiuri de plasă de discretizare

Workbench Mesh.svg

Introducere

Atelierul Plase Mesh Workbench se ocupă de mesh triangle. Plasele/Mesh-urile sunt un tip special de obiect 3D, compuse din fațete triunghiulare legate de marginile lor și de colțurile lor (numite și vârfuri).

Multe aplicații 3D utilizează ochiurile de plasă ca tip principal de obiect 3D, cum ar fi sketchup, Blender , Maya sau 3D Studio Max, utilizează plase ca primă alegere de elecție. Deoarece plasele sunt obiecte foarte simple, conținând numai vârfuri (puncte), muchii și fațete (triunghiulare), ele sunt foarte ușor de creat, modificat, subdivizat, întins și ușor de trecut de la o aplicație la alta fără nici o pierdere. În plus, deoarece conțin date foarte simple, aplicațiile 3D pot gestiona, de obicei, cantități foarte mari din acestea fără nici o problemă. Din aceste motive, plasele sunt adesea tipul de obiect 3D preferat pentru aplicații care se ocupă cu filmele, animația și crearea imaginilor.

Cu toate acestea, în domeniul rețelelor de inginerie există o mare limitare: ele sunt doar realizate din suprafețe și nu au informații despre masă, deci nu se comportă ca solide. Aceasta înseamnă că toate operațiunile de bază pentru solide, cum ar fi adunarea sau scăderea, sunt dificil de realizat pe ochiuri de plasă. Mesh Workbench este util să importați date 3D în format de plase, să le analizați, să detectați erorile și, în final, să le convertiți într-un solid, pentru a fi utilizate cu Part Workbench.

Contents

Mesh example.jpg

Instrumente

Modulul de plase are în prezent o interfață foarte simplă, toate funcțiile sale fiind grupate în intrarea din meniul Mesh

Instrumente Generale

Analiza

Regular solid

  • Mesh Regular Solid.png Regular solid... Creează plase din primitive geometrice ca de ex:cuburi, cylindri, conuri, sau sfere:
    • Mesh Cube.png Create a mesh cube
    • Mesh Cylinder.png Create a mesh cylinder
    • Mesh Cone.png Create a mesh cone
    • Mesh Sphere.png Create a mesh sphere
    • Mesh Ellipsoid.png Create a mesh ellipsoid
    • Mesh Torus.png Create a mesh torus

Boolean

  • Union: Realizează o uniune/fuziun e cu plase
  • Intersection: Realizează o intersecție/common de plase
    • Difference: Realizează o diferență/cut de plase

Cutting

Altele

Preferences

Mai multe instrumente pentru plase sunt disponibile în Atelierul OpenSCAD Workbench.

Plasele pot fi de asemenea manipulate cu Mesh Scripting.

Legături

Lucrul cu Atelierul Piesa

Workbench Part.svg

Introducere

Capacitățile de modelare a solidelor ale FreeCAD se bazează pe kernelul Open Cascade Technology (OCCT), un sistem CAD de calitate profesionistă, care oferă crearea și manipularea geometriei avansate 3D.

Atelierul Piese permite utilizatorului să acceseze și să utilizeze obiectele și funcțiile OCCT. Obiectele piese, spre deosebire de Mesh objects, sunt mai complexe și, prin urmare, permit operații mai avansate cum ar fi operațiile booleene coerente, istoricul modificărilor și comportamentul parametric.

Part objects are more complex than mesh objects created with the Mesh Workbench, as they permit more advanced operations like coherent boolean operations, modifications history, and parametric behaviour.

Part example.jpg

Part Workbench relationships.svg

The Part Workbench is the basic layer that exposes the OCCT drawing functions to all workbenches in FreeCAD


Instrumente

Instrumentele sunt toate amplasate în meniul Part

Primitive

Acestea sunt instrumente pentru crearea de obiecte primitive grafice.

  • Part Box.png Caseta: Deseneaza o caseta prin specificarea dimensiunile sale
  • Part Cylinder.png Cilindru: Deseneaza un cilindru prin specificarea dimensiunile sale
  • Part Sphere.png Sfera: Deseneaza o sfera prin specificarea dimensiunile sale
  • Part Cone.png Con: Deseneaza un con prin specificarea dimensiunile sale
  • Part Torus.png Tor: Deseneaza un tor (inel) prin specificarea dimensiunile sale
  • Part CreatePrimitives.png Creaza primitive: Unealta pentru crearea primitivelor geometrice bazate pe parametrii
  • Part Shapebuilder.png Creaza forme: Unealta pentru crearea formelor complexe din primitive geometrice bazate pe parametrii

Modificarea obiectelor

Acestea sunt unelte pentru modificarea obiectelor existente. Ele permit alegerea obiectelor cu care se lucrează.

  • Part Extrude.png Extrudare: Extrudeaza fetele plane ale unui obiect
  • Part Revolve.png Rotatie: Creaza un obiect prin rotirea altui obiect in jurul unei axe
  • Part Mirror.png Simetrizare: Simetrizează obiectul selectat fata de un plan
  • Part Fillet.png Panglica: Rotunjeste marginile unui obiect
  • Part Chamfer.png Tesire: Teseste marginile unui obiect
  • Part RuledSurface.png Ruled Surface:
  • Part Loft.png Mansardare: Uneste un profil de altul
  • Part Sweep.png Baleiere: Baleiază unul sau mai multe profile de-a lungul unei cai
  • Part CompOffsetTools.png Offset tools:
    • Part Offset.png 3D Offset: Construiește o formă paralelă la o anumită distanță față de original.
    • Part Offset2D.png 2D Offset: Construiește o polilinie paralelă la o anumită distanță față de original, sau enlarges/shrinks o fațetă plană. (v0.17)
  • Part Thickness.png Thickness: Golește un solid, lăsând deschideri lângă fațetele selectate.
  • Part Booleans.png Logice: Efectueaza operatii logice asupra obiectelor
  • Part Union.png Fuziune: Uneste doua obiecte
  • Part Common.png Comun: Extrage partea comuna a doua obiecte
  • Part Cut.png Decupare: Substrage on obiect din celalalt
  • Part CompJoinFeatures.png Join features: funcții booleene inteligente pentru obiecte de pus în perete (de ex țevi) (v0.16)
    • Part JoinConnect.png Connect: Conectează interiorul obiectelor (v0.16)
    • Part JoinEmbed.png Embed: Include un obiect din perete într-un alt obiect din perete(v0.16)
    • Part JoinCutout.png Cutout: Crează o tăietură într-un peretele unui obiect pentru un alt obiect de pus în perete (v0.16)
  • Part CompSplittingTools.png Splitting tools: (v0.17)
    • Part BooleanFragments.png Boolean fragments: face toate piesele care pot fi obținute prin operații booleene între obiecte (v0.17)
    • Part SliceApart.svg Slice a part: instrument pentru a separa forme prin intersecția cu alte forme
    • Part Slice.png Slice: Separă un obiect în piese prin intersecții cu un alt obiect(v0.17)
    • Part XOR.png XOR:

elimină spațiul partajat de un număr par de obiecte (versiunea simetrică a Cut) (v0.17)

Measure

Std Measure Menu.png Measure: Allows linear and angular measurement between points, edges, and faces.

Alte Instrumente

  • Part ImportCAD.png Import CAD: Acest insrument vă permite să adăugați un fișier tip *.IGES, *.STEP, *.BREP în documentul curent.
  • Part ExportCAD.png Export CAD: Acest instrument vă permite să ecportați un obiect piesă într-un fișier tip *.IGES, *.STEP, *.BREP .
  • Part ShapeFromMesh.png Shape from Mesh: Crează un obiect formă dintr-un obiect tip plasă.
  • Convert to solid: Convertește un obeict formă într-un obeict tip solid.
  • Reverse shapes: Îndepărtează normalele tuturor fețelor obiectului selectat.
  • Part CreateSimpleCopy.svg Create simple copy: Creează o simplă copie a obeictului selectat.
  • Part RefineShape.png Refine shape: Curăță fațetele prin ștergerea liniilor nenecesare.
  • Part CheckGeometry.png Check geometry: Verifică de erori geometria obiectelor selectate.
  • Measure: Permite măsurări liniare și unghiulare între points/edges/faces.
  • Part Attachment.svg Attachment: Atașamentul este o utilitatea de atașare a unui obiect la un altul .

Preferințe

Conceptele geometrice OCCT

În terminologia OpenCascade, facem distincția între primitivele geometrice și formele (topologice). O primitivă geometrică poate fi un punct, o linie, un cerc, un plan etc. sau chiar unele tipuri mai complexe, cum ar fi o curbă sau o suprafață B-Spline. O formă poate fi un vârf, o margine, un fir, o fațetă, un solid sau un compus de alte forme. Primitivele geometrice nu sunt făcute pentru a fi afișate direct pe scena 3D, ci mai degrabă pentru a fi utilizate ca geometrie a clădirilor pentru forme. De exemplu, o muchie poate fi construită dintr-o linie sau dintr-o porțiune dintr-un cerc.

În rezumat, primitivele geometrice sunt blocuri "fără formă", în timp ce formele topologice sunt obiectele reale construite pe ele.

O listă completă a tuturor primitevelor și formelor se referă la OCC documentation (Alternative: sourcearchive.com) și căutați pentru Geom_* (for geometric primitives) and TopoDS_* (for shapes). Acolo puteți citi mai multe despre diferențele dintre obiectele și formele geometrice. Rețineți că, din păcate, documentația oficială OCC nu este disponibilă online (trebuie să descărcați o arhivă) și se adresează în principal programatorilor, nu utilizatorilor finali. Dar sperăm că veți găsi suficiente informații pentru a începe aici.

Tipurile geometrice pot fi împărțite în două grupe majore: curbe și suprafețe. Din curbe (linie, cerc, ...) puteți construi direct o margine, din suprafețe (plan, cilindru, ...) se poate construi o fațetă. De exemplu, linia primitivă geometrică este nelimitată, adică ea este definită de un vector de bază și de un vector de direcție, în timp ce reprezentarea formei sale trebuie să fie ceva limitat de un început și un punct final. Și o cutie - un solid - poate fi creată din doar șase planuri .

De la o margine sau o fațetă se poate reveni la omologul său geometric primitiv.

Astfel, din forme puteți construi piese foarte complexe sau, invers, extrageți toate sub-formele dintr-o formă mai complexă.

Part TopoShape relationships.svg

The "Part::TopoShape" is the geometrical object that is seen on screen. Essentially all workbenches use these TopoShapes internally to build and display edges, faces, and solids.


Scripting

See also: Part scripting

Structura principală de date folosită în atelierul Piese este tipul de date BRep din OpenCascade. Aproape toate tipurile de conținut și obiecte ale modulului Piese sunt acum disponibile pentru scripting Python. Acestea includ primitive geometrice, cum ar fi linia și cercul (sau arcul de cerc) și întreaga gamă de topo-forme, cum ar fi vârfuri, margini, fire/polilinii, fațete, solide și compuși. Pentru fiecare din aceste obiecte există mai multe metode de creare, iar pentru unele dintre ele, în special pentru TopoShapes, sunt disponibile și operații avansate precum unirea booleană/diferența/intersecția. Explorați conținutul modulului Part, așa cum este descris în pagina FreeCAD Scripting Basics, pentru a afla mai multe.

The most basic object that can be created is a Part Feature, which has a simple DATAPlacement property, and basic properties to define its color and appearance.

Another simple object used in 2D geometrical objects is Part Part2DObject, which is the base of Sketches, and most Draft elements.

Exemple

Pentru a crea un element tip linie comutați la consola Python și tastați:

import Part,PartGui 
doc=App.newDocument()  
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()

Să trecem pas cu pas prin exemplul python de mai sus:

import Part,PartGui
doc=App.newDocument()

încarcă modulul Parte și creează un document nou

l=Part.LineSegment()
l.StartPoint=(0.0,0.0,0.0)
l.EndPoint=(1.0,1.0,1.0)

Linia este, de fapt, un segment de linie, prin urmare, este definită prin punctul de început și punctul final.

doc.addObject("Part::Feature","Line").Shape=l.toShape()

Această comandă adaugă un tip de obiect Part la document și atribuie reprezentarea de formă a segmentului de linie la proprietarea "Shape" a obiectului adăugat. Este important să înțelegem aici că am folosit o primitivă geometrică (Part.LineSegment) pentru a crea o TopoShape din ea (the toShape ()method). Doar formele pot fi adăugate în document. În FreeCAD, primitivele geometrice sunt folosite ca "structuri de bază" pentru construirea formelor(Shapes).

doc.recompute()

Actualizează documentul. Aceasta pregătește, de asemenea, reprezentarea vizuală a obiectului nou parte.

Rețineți că un segment poate fi creat prin specificarea punctului de start și a punctului final direct în constructor, de exemplu Part.LineSegment(point1,point2), sau putem crea o linie implicită și apoi să-i stabilim proprietățile după cum am făcut aici.

Un cerc poate fi creat în mod similar:

import Part
doc = App.activeDocument()
c = Part.Circle() 
c.Radius=10.0  
f = doc.addObject("Part::Feature", "Circle")
f.Shape = c.toShape()
doc.recompute()

Notați din nou, că am folosit cercul (primitivă geometrică) pentru a construi o formă din ea. Desigur, putem avea acces la geometria constructivă după aceea, făcând:

s = f.Shape
e = s.Edges[0]
c = e.Curve

Aici luăm forma obiectului nostru f, apoi luăm lista sa de muchii. În acest caz, va exista doar unul pentru că am făcut întreaga formă dintr-un singur cerc, așa că luăm doar primul element din lista Edges și luăm curba sa. Fiecare Edge are o curbă, care este o primitivă geometrică pe care se bazează.

Îndreptați-vă spre pagina Topological data scripting dacă doriți să cunoașteți mai multe.

Tutorials

Lucrul cu Atelierul Desen 3 D

Workbench Drawing.svg

Introducere

Development of the Drawing Workbench Elaborarea modulului de desenare a fost oprită și un nou modul TechDraw Workbench care intenționează să-l înlocuiască va fi introdus în versiunea 0.17. Ambele module vor fi furnizate în v0.17, dar modulul Desenare poate fi eliminat în versiunile viitoare.


Modulul de desenare vă permite să puneți lucrul 3D pe hârtie. Adică, pentru a afișa vizualizările modelelor dvs. într-o fereastră 2D și pentru a insera acea fereastră într-un desen, de exemplu o foaie cu graniță, un titlu și logo-ul dvs. și, în final, să tipăriți această foaie.

Drawing extraction.png

Instrumente

Unelte pentru crearea, configurarea si exportul foilor de desen 2D

  • Drawing Annotation.png Annotation: Adaugă o adnotare în foaia de desen curent
  • Drawing Clip.png Clip: Adaugă un grup de clipuri în foaia de desen curent
  • Drawing Openbrowser.png Open Browser: Deschide o previzualizare a foii curente din browser
  • Drawing Orthoviews.png Ortho Views: Creează automat vederi ortografice ale unui obiect
  • Drawing Symbol.png Symbol: Adaugă conținutul unui fișier SVG ca simbol în foaie de desen curentă
  • Drawing DraftView.png Draft View: Inserează o vizualizare specială a unui obiect selectat în foaia de desen curent
  • Drawing SpreadsheetView.png Spreadsheet View: Inserts a view of a selected spreadsheet in the current drawing sheet
  • Project Shape: Creează o proiecție a obiectului selectat (Sursă) în vizualizarea 3D.
  • Notă Note:

Instrumentul Draft View este utilizat în special pentru a plasa obiecte 2D Draft pe hârtie. Acesta are câteva capabilități adiționale și suportă obiecte specifice ca de ex: Draft dimensions.

Flux de lucru

Documentul conține un obiect 3D (Schenkel) din care dorim să realizăm un desen. Prin urmare, este creată o "pagină". O pagină este instanțiată dintr-un șablon, de exemplu șablonul "A3_Landscape". Șablonul este un document SVG care poate conține un cadru de pagină, un logo și alte elemente.

În această pagină putem introduce una sau mai multe vizualizări. Fiecare vizualizare are o poziție pe pagină (Proprietăți X, Y), un factor de scară (Scala proprietății) și proprietăți suplimentare. De fiecare dată când pagina sau vizualizarea sau obiectul referință se modifică, pagina este regenerată și actualizarea paginii este actualizată.

Scrip-Programare

În prezent, fluxul de lucru al interfeței grafice cu utilizatorul este foarte limitat, astfel încât API-ul de scripting este mai interesant.

Consultați pagina Drawing API example pentru o descriere a funcțiilor utilizate pentru a crea pagini de desen și vizualizări.

Macrocomanda CartoucheFC vă permite să creați o casetă informativă personalizată pe o pagină A3 landscape.

Șabloane

FreeCAD este livrat împreună cu un set de șabloane implicite, dar puteți găsi mai multe în pagina Drawing templates .

Extensii la Atelierul de Desen 3D

Unele note despre partea de programare a modulului de desen vor fi adăugate la pagina Drawing Documentation . Acest lucru va ajuta să intelegeți rapid modul în care funcționează modulul de desen, permițând programatorilor sa înceapă rapid programarea pentru aceasta.

Tutoriale

legături Externe

Lucrul cu Atelierul de Rrandare

Workbench Raytracing.svg

Introducere

Atelierul de Randare Raytracing Workbench

este folosit pentru a genera imagini fotorealiste ale modelelor dvs., făcându-le  o randare exterioară.

Atelierul de Randare funcționează împreună cu modulele templates, care sunt fișiere de proiect care definesc o scenă pentru modelul dvs. 3D. Puteți localiza luminile și geometria, cum ar fi avioanele de la sol și conține, de asemenea, suporturi pentru poziția camerei și pentru informațiile materiale ale obiectelor din scenă. Proiectul poate fi apoi exportat într-un fișier gata de redare sau poate fi redat direct în cadrul FreeCAD.

În mod obișnuit, sunt susținute două tipuri de randare: povray și luxrender. Pentru a putea randa direct din FreeCAD, cel puțin unul dintre aceste programe trebuiesc instalate pe sistemul dvs., iar calea trebuie să fie configurată în preferințele FreeCAD Raytracing. Totuși dacă nici un program de randare nu este instalat, veți putea să exportați un fișier scenă care poate fi folosit ulterior.

În prezent, există un nou Atelier Renderer în dezvoltare pentru a sprijini multiple back-end-uri precum Lux Renderer și Yafaray. Informațiile pentru utilizarea versiunii în dezvoltare pot fi vizualizate laRender_project. Pentru a afla starea de dezvoltare a modulului Render căutați în proiectul Raytracing project..

Raytracing example.jpg

Flux de lucru tipic

  1. Creați sau deschideți un proiect FreeCAD, adăugați unele obiecte Part-based (mesh-urile nu sunt acceptate în prezent)
  2. Creați un proiect Raytracing (cu luxrender sau povray)
  3. Selectați obiectele pe care doriți să le adăugați la proiectul raytracing și adăugați-le la proiect cu instrumentul "Inserați o piesă"
  4. Exportați sau afișați direct


Raytracing Workbench workflow.svg


Workflow of the Raytracing Workbench; atelierul de lucru pregătește un fișier de proiect dintr-un șablon dat și apoi apelează un program extern pentru a produce randarea reală a scenei. Programul de randare extern poate fi folosit independent de FreeCAD.


Instrumente

Instrumente de Proiect

Acestea sunt instrumentele principale pentru exportul lucrării dvs. 3D la programe de randare externe.

  • Raytracing New.png New PovRay project: Inserează un nou proiect PovRay project în document
  • Raytracing Lux.png New LuxRender project: Inserează un nou proiect LuxRender în document
  • Raytracing InsertPart.png Insert part: Introduceți o imagine a unei părți într-un proiect de proiectare
  • Raytracing ResetCamera.png Reset camera: Potrivește poziția camerei unui proiect de proiectare la vizualizarea curentă
  • Raytracing ExportProject.png Export project: Exportă un proiect raytracing unui fișier de scenă pentru randarea într-un renderer extern
  • Raytracing Render.png Render: Proiectarea unui proiect de raytracing cu un renderer extern

Utilități

Acestea sunt instrumente de ajutor pentru a efectua sarcini specifice în mod manual.

Preferințe

  • Std DlgParameter.png Preferences: Preferințele disponibile pentru instrumentele Raytracing.

Tutorials

Crearea manuală a unui fișier povray

Instrumentele utilitare descrise mai sus vă permit să exportați vizualizarea 3D curentă și întregul conținut al acestuia într-un fișier Povray. În primul rând, trebuie să încărcați sau să creați datele CAD și să poziționați orientarea 3D în orientarea dorită. Apoi alegeți "Utilities-> Export View ..." din meniul raytracing.

FreeCAD Raytracing.jpg

Vi se va solicita o locație pentru salvarea fișierului * .pov rezultat. După asta, poți să o deschizi Povray and render:

Povray.jpg

Ca de obicei, prin randare poți face poze mari și frumoase:

Scharniergreifer render.jpg

Script-Programare

A se vedea Raytracing API example pentru informații asupra scrierii programelor de scene.

Legături

POVRay

Luxrender

Viitoare posibile randări de implementat

Export către Kerkythea

Deși exportul direct către fișierul Kerkythea XML-File-Format nu este încă acceptat, puteți să exportați Obiectele ca Fișiere Mesh (.obj) și apoi să le importați în Kerkythea.

  • dacă folosiți Kerkythea pentru Linux, nu uitați să instalați pachetul WINE (necesar pentru Kerkythea pentru Linux)
  • puteți să vă transformați modelele cu ajutorul Atelierul Plase în plase și apoi să le exportați ca fișiere .obj
  • Dacă plasa dvs. la exportare a dus la erori (modificări de normale, găuri ...), vă puteți încerca norocul cu studio netfabb studio
Gratuit pentru uz personal, disponibil pentru Windows, Linux și Mac OSX.
Dispune de instrumente de reparații standard care vă vor repara modelul în majoritatea cazurilor.
  • un alt program bun pentru analiza / repararea ochiului este Meshlab
Open Source, disponibil pentru Windows, Linux și Mac OSX.
Dispune de instrumente de reparații standard care vă vor repara modelul în majoritatea cazurilor (găuri de umplere, re-orientare de normale etc.)
  • puteți utiliza "make compound" și apoi "face o singură copie" sau puteți fuziona solide pentru a le grupa înainte de a converti în plase cu ochiuri
  • nu uitați să setați în Kerkythea un factor de import de 0.001 pentru obj-modeler, deoarece Kerkythea se așteaptă ca fișierul obj să fie în m (dar unitățile standard-scheme în FreeCAD sunt mm)
În cadrul ferestrelor Windows 7 Kerkythea pe 64 de biți nu pare să poată salva aceste setări.
Așa că nu uitați să faceți acest lucru de fiecare dată când porniți Kerkythea
  • dacă importați mai multe obiecte în Kerkythea, puteți folosi comanda "File>Merge" în Kerkythea

Sugestii de legături

Lucrul cu Atelierul Imagine

Workbench Image.svg

Introducere

Atelierul Imagine Image Workbench gestionează diferite tipuri de bitmap images și vă permite să le deschideți în FreeCAD.

În prezent, modulul vă permite să deschideți ”open format” de fișiere tip .bmp, .jpg, .png și .xpm .

Instrumente

  • Image-import.svg Open: open an image on a new viewport.
  • Image-import-to-plane.svg Import to plane: import an image to a plane in the 3D view.
  • Image-scale.svg Scaling: scale an image imported to a plane.

Funcționalități

  • Atelierul Imagine vă permite de asemenea să importați o imagine într-un plan spațial 3D al FreeCAD cu Image Import, cu al doilea buton al atelierului Imagine.
  • Imaginea importată poate fi atașată la o schiță a uneia dintre cele trei planuri (XY / XZ / YZ) cu ​​offset pozitiv sau negativ.
  • Această funcție este disponibilă numai dacă ați deschis un document FreeCAD.
  • The image can be moved in 3D-space by editing the placement in the Property editor.
  • The major use is tracing over the image, in order to generate a new part while using the image as a template.
  • The image is imported with 1 pixel = 1mm.
 * The recommendation is to have the imported image at a reasonable resolution.
  • Imaginea poate fi scalată prin editarea valorilor "XSize" și "YSize" înProperty editor.
  • Imaginea poate fi mutată prin editarea valorilor X/Y/Z-în Property editor.
  • Imaginea poate fi rotită în jurul unei axe utilizând Property editor.

Flux de lucru

O utilizare importantă a acestui atelier de lucru este urmărirea imaginii, cu ajutorul instrumentelor Draft sau Sketcher, pentru a genera un corp solid bazat pe contururile imaginii.

Tip:
Urmărirea cu elemente de schiță peste o imagine funcționează cel mai bine dacă imaginea are o mică (negativă) decalare față de planul de schiță.
Puteți seta o decalare de -0,1 mm la import sau mai târziu, prin editarea destinației de plasare a imaginii.

Decalajul imaginii poate fi setat în timpul importului sau poate fi modificat mai târziu prin proprietățile sale.



Lucrul cu modul Desen 2 D

Workbench Draft.svg

Introducere

Atelierul Draft vă permite desenarea rapidă a unor obiecte bidimensionale în documentul curent şi oferă mai multe unelte pentru modificarea lor ulterioară. De asemenea, oferă instrumente pentru a defini un plan de lucru, o rețea și un sistem de ancorare pentru a controla precis poziția geometriei dvs.

Obiectele create 2D pot fi folosite pentru redactarea generală într-un mod similar cu Inkscape sau Autocad. Aceste forme 2D pot fi de asemenea utilizate ca componente de bază ale obiectelor 3D create cu alte ateliere de lucru, de exemplu, Part și Arch Workbench. Este, de asemenea, posibilă transformarea de obiecte Draft în Sketches, ceea ce înseamnă că formele pot fi de asemenea utilizate cu PartDesign Workbench pentru crearea de corpuri solide.

FreeCAD este în primul rând o aplicație de modelare 3D și, prin urmare, instrumentele sale 2D nu sunt la fel de avansate ca în cazul altor programe de desenare. Dacă obiectivul dvs. principal este producerea de desene complexe 2D și fișiere DXF și nu aveți nevoie de modelare 3D, vă recomandăm să luați în considerare un program software dedicat pentru redactarea tehnică, cum ar fi LibreCAD, QCad, TurboCad, ș.a.m.d.

Draft Workbench Example

Desenarea obiectelor

Aceste unelte se folosesc la crearea obiectelor.

  • Draft Line.png Linie din 2 puncte: Trasează un segment de linie definit prin 2 puncte.
  • Draft Wire.png Fir/Poliline: Desenează o linie formată din mai multe segmente.
  • Draft Circle.png Cerc: Trasează un cerc definit prin centru şi rază.
  • Draft Arc.png Arc: Desenează un arc cu definit prin centru, rază, unghiul iniţial şi cel final.
  • Draft Ellipse.png Ellipse: Desenează o elipsă definită prin două puncte, definind colțuri diagonale ale unei casete rectangulare în care se va încadra elipsa
  • Draft Polygon.png Poligon: Desenează un poligon regulat definit prin centrul, rază și numărul de laturi.
  • Draft Rectangle.png Rectangle: Trasează un dreptunghi folosind ca repere capetele diagonalei.
  • Draft Text.png Text: Adaugă o casetă text cu mai multe linii de scriere.
  • Draft Dimension.png Dimensiuni: Introduce o dimensiune de cotare.
  • Draft BSpline.png BSpline: Trasează o curbă (B-Spline) folosind o serie de puncte.
  • Draft Point.png Punct: Inserează un punct.
  • Draft ShapeString.png ShapeString: Instrumentul ShapeString introduce o formă compusă reprezentând un șir de text într-un punct dat în documentul curent
  • Draft Facebinder.png Facebinder:Creează un obiect nou din fațetele selectate pe obiectele existente
  • Draft BezCurve.png Bezier Curve: Desenează o curbă Bezier definită printr-o serie de puncte
  • Draft Label.png Label: Plasează o etichetă cu o săgeată care indică un element selectat Disponibil în versiune 0.17

Modificarea obiectelor

Aceste unelte modifică obiectele existente. Ţinta lor sunt obiectele selectate, iar dacă nu exista nici un obiect selectat veţi fi invitat să selectaţi unul.

Multe instrumente de operare (mutare, rotire, matrice etc.) lucrează și pe obiecte solide (Part, PartDesign, Arch, etc.).

  • Draft Move.png Muta: Mută obiectele dintr-o locaţie în alta.
  • Draft Rotate.png Rotire: Roteşte obiectele de la un unghi iniţial la un unghi final.
  • Draft Offset.png Expandare: Mută segmentele unui obiect la o anumită distanţă constantă.
  • Draft Trimex.png Taie/Extinde (Trimex): Taie sau extinde un obiect.
  • Draft Upgrade.png Unire: Uneşte obiectele intr-un singur obiect mai complex.
  • Draft Downgrade.png Explodare: Sparge un obiect complex în părţi (obiecte mai simple).
  • Draft Scale.png Scalare: Scalează obiectele selectate în jurul punctului de bază.
  • Draft PutOnSheet.png Desenare: Transferă şi transcrie obiectele selectate pe o foaie de desen.
  • Draft Edit.png Editare: Editează obiectul selectat.
  • Draft WireToBSpline.png Polilinie in BSpline: Converteşte o polilinie într-o curbă (BSpline) şi viceversa.
  • Draft AddPoint.png Adauga punct: Inserează un punct intr-o polilinie sau curbă (BSpline).
  • Draft DelPoint.png Sterge point: Şterge un punct dintr-o polilinie sau curbă (BSpline).
  • Draft Shape2DView.png Vizualizare 2D a formei: Creează un obiect 2D care reprezintă proiecţia unui obiect 3D.
  • Draft Draft2Sketch.png Ciorna in schita: Converteşte un obiect 2D (Draft) în schiţă şi viceversa.
  • Draft Array.png Multimi: Creează o matrice de simetrie polară sau rectangulară multiplicând obiectele selectate.
  • Draft PathArray.png Path Array: Creează o serie de obiecte prin plasarea copiilor de-a lungul unei traiectorii
  • Draft Clone.png Clonare: Clonează obiectele selectate.
  • Draft Mirror.png Mirror: Simetrizează obiectele selectate
  • Draft Stretch.png Stretch: Extinde obiectele selectateDisponibil în versiune 0.17

Utilitare

O serie de instrumente suplimentare sunt oferite de un meniu Draft → Utilities, sau cu clic-dreapta în meniul contextual, în funcţie de obiectele selectate:

Preferințe

  • Preferences-draft.svg Preferences: Preferințe disponibile în Atelierul Draft Workbench.
  • Preferences-import-export.svg Import-Export Preferences: preferințele disponibile pentru importul și exportul în diferite formate de fișiere.

Formate de fişiere

Atelierul Desen 2D (Draft) înzestrează FreeCAD cu importul şi exportul următoarele formate de fişiere:

Caracteristici suplimentare

introduceți coordonatele în loc să faceți clic pe vizualizarea 3D pentru a defini un nou punct.

limitați pointerul la mișcări orizontale sau verticale în raport cu un punct anterior.

plasați noi puncte pe locuri speciale pe obiecte existente sau pe grilă.

Script

Instrumentele de proiectare pot fi utilizate în macros și din consola Python utilizând API-ul de proiect.

Îndrumătoare

Biblioteci de Fișiere și Macrocomenzi

Macros

Introduction

Macrocomenzile reprezintă o modalitate convenabilă de a crea acțiuni complexe în FreeCAD. Pur și simplu înregistrați acțiunile, salvați-le sub un nume și repetați-le ori de câte ori doriți. Deoarece macrocomenzile sunt în realitate o listă de comenzi python, puteți să le editați și să creați scripturi foarte complexe.

While Python scripts normally have the .py extension, FreeCAD macros should have the .FCMacro extension. A collection of macros written by experienced users is found in the macros recipes page.

See Introduction to Python to learn about the Python programming language, and then Python scripting tutorial and FreeCAD Scripting Basics to learn about writing macros.

Cum funcționează

Dacă activați consola de ieșire (Meniu Editare -> Preferences -> General -> Macros -> Afișează comenzi script în consola python), veți vedea că în FreeCAD, fiecare acțiune pe care o faceți, de exemplu apăsând un buton generează o comandă python. Aceste comenzi sunt ceea ce poate fi înregistrat într-o macrocomandă. Instrumentul principal pentru realizarea macrocomenzilor este bara de scule a macroco-urilor: Macros toolbar.jpg. Pe bara aveți 4 butoane: Înregistrare, oprire înregistrarea, editare și rularea macro-ul curent.

Este foarte simplu de utilizat: Apăsați butonul de înregistrare, vi se va cere să dați un nume macro, apoi efectuați unele acțiuni. Când ați terminat, faceți clic pe butonul de oprire și acțiunile dvs. vor fi salvate. Acum puteți accesa dialogul macro cu butonul de editare:

Macros.png

Acolo puteți gestiona macrocomenzile, puteți șterge, edita, duplica, instala sau crea altele noi de la zero. Dacă editați o macrocomandă, aceasta va fi deschisă într-o fereastră de editor unde puteți modifica codul acesteia. Noile macrocomenzi pot fi instalate folosind butonul Addons ... care se leagă de AddonManager.

Exemplu

Apăsați butonul de înregistrare, dați un nume, să zicem "cilindru 10x10", apoi, în Part Workbench, creați un cilindru cu raza = 10 și înălțimea = 10. Apoi apăsați butonul "stop recording". În dialogul de editare a macrocomenzilor, puteți vedea codul python care a fost înregistrat și, dacă doriți, modificați-l. Pentru a executa macrocomanda, apăsați butonul de execuție din bara de instrumente în timp ce macro-ul dvs. este în editor. Sunt întotdeauna salvate pe disc, astfel încât orice schimbare pe care o faceți sau orice macro nouă pe care o creați, va fi întotdeauna disponibilă data viitoare când porniți FreeCAD.

Personalizare

Desigur, nu este practic să încărcați o macrocomandă în editor pentru a o folosi. FreeCAD oferă o modalitate mai bună de a utiliza macrocomanda, cum ar fi atribuirea unei comenzi rapide de la tastatură sau introducerea unei intrări în meniu. Odată ce ați creat macrocomanda, puteți face acest lucru prin meniul Instrumente -> Personalizare:

Macros config.jpg

Customize ToolbarsÎn acest fel, puteți face ca macrocomanda să devină un instrument real, la fel ca orice instrument standard FreeCAD. Acest lucru, adăugat la puterea scripting-ului Python în cadrul FreeCAD, face posibilă adăugarea ușoară a propriilor instrumente la interfață. Citiți pagina Scripting dacă doriți să aflați mai multe despre scrierea Python ...

Crearea de macrocomenzi fără înregistrare

How to install macros De asemenea, puteți copia / lipi direct codul python într-o macrocomandă, fără a înregistra acțiunea GUI. Pur și simplu creați o macrocomandă nouă, editați-o și inserați-vă codul. Apoi puteți salva macro-ul dvs. în același mod în care salvați un document FreeCAD. Data viitoare când porniți FreeCAD, macroul va apărea sub elementul "Macro instalat" din meniul Macro.

Depozitul de Macrocomenzi

Vizitați pagina Macros recipes pentru a alege unele macrocomenzi utile pentru a adăuga instalarea FreeCAD.


Introducere în Python

(noiembrie 2018) FreeCAD a fost conceput inițial pentru a lucra cu Python 2. Multe caracteristici lucrează cu Python 3, dar unele nu. Efectuarea suportului deplin al FreeCAD Python 3 este o lucrare în desfășurare. Informația descrie aici Python 2, dar cea mai mare parte a codului ar trebui să funcționeze la fel cu Python 3. În special, funcția print () este preferată față de instrucțiunea print veche.

Acesta este un scurt tutorial pentru cei nou veniți în Python. Python is an open-source, multiplatform programming language. Python are mai multe caracteristici care o fac foarte diferită de alte limbaje și este foarte accesibil utilizatorilor noi ca tine:

  • A fost special conceput pentru a fi ușor de citit de ființe umane, și de aceea este foarte ușor de învățat și de înțeles.
  • Este un limbaj interpretat, este faptul că, spre deosebire de limbajele compilate cum ar fi C, programul nu trebuie să fie compilate înainte de a fi executat. Codul pe care îl scrieți, dacă doriți. Pentru că puteți merge încet, pas cu pas, este extrem de ușor de a învăța și de a găsi erori în cod.
  • Poate fi încorporat în alte programe pentru a fi folosit ca limbaj de scripting. FreeCAD are un interpretor Python încorporat; puteți scrie cod Python în freecad, Aceasta va Manipulează părți ale freecad, de exemplu, pentru a crea geometrie. Acest lucru este extrem de puternic, în loc de doar clic pe butonul închidere a Etichetat „creați sferă“ pe care unii ARE program de coduri; tu ai libertatea de a construi cu ușurință propriul instrument, care crează exact geometria dorită, într-o formă de și manieră pe care programatorul nu o putea prevedea.
  • Este extensibil, vă puteți conecta cu ușurință la funcționalitatea dvs. De exemplu,sunt modulele care permit Python-ului să citească și să scrie imagini jpg pentru a comunica cu Twitter, pentru a programa sarcinile care trebuie efectuate de sistemul de operare, etc.

Vă recomandăm cu tărie să introduceți fragmentele de cod de mai jos într-un interpret Python. Pentru multe dintre exemplele noastre, punctul important este linia după execuția codului, rezultatul. Și acum la muncă! Rețineți că următoarea este o introducere simplificată și, în nici un caz, un tutorial complet. Dar sperăm că după această lectură ați dobândit bazele necesare pentru a cunoaște și exploata mai profund mecanismele FreeCad.

Interpretorul

De obicei, când scrieți programe de calculator, deschideți pur și simplu un editor de text sau mediul de programare special (care este, de obicei, un editor de text cu mai multe instrumente suplimentare), scrieți programul, apoi compilați și executați. În mod obișnuit, au fost făcute una sau mai multe erori la intrare, astfel încât programul dvs. nu va funcționa. S-ar putea să primiți chiar și un mesaj de eroare care să vă spună ce sa întâmplat. Apoi, reveniți la editorul de text, corectați greșelile, executați din nou, repetând până când programul dvs. funcționează așa cum doriți.

Întregul proces, în Python, poate fi făcut transparent în interiorul interpretrului Python. Interpretorul este o fereastră Python cu un prompt de comandă, unde puteți introduce pur și simplu codul Python. Dacă instalați Python pe computerul dvs. (descărcați-l din Python website dacă sunteți pe Windows sau Mac, instalați-l din depozitul de pachete dacă sunteți pe GNU / Linux), veți avea un interpretor Python în meniul de pornire. Însă FreeCAD are și un interpretor Python în fereastra inferioară:

Screenshot pythoninterpreter.jpg

(Dacă nu o aveți, click pe View --> Panels --> Python console.)

Interpretorul arată versiune Python, apoi un simbol >>> , care este promptul comenzii, chiar așa, unde introduceți codul Python. Scrierea unui cod în interpretor este simplă: o linie este o instrucțiune. Când apăsați Enter, linia de cod va fi executată (după ce a fost compilată instant și netransparent pentru user). De exemplu, încercați să scrieți acest lucru:

print "hello"

print este un cuvânt cheie în Python care înseamnă ca, bineînțeles, că printezi ceva pe ecran. Când apeși Enter, operația este executată , și mesajul "hello" este afișat. Dacă faci o greșeală, să scriem de exemplu:

print hello

Python îți va spune că nu știe ce este hello . Ghilimelele " spun despre conținut că este un șir de caractere, care pur și simplu în jargonul informatic înseamnă o bucată de test. Fără ghilimele ", comanda de afișare a lui hello, acesta nu este recunoscut ca fiind un text , ci ca un cuvânt comandă special rezervat în Python.Important este că obțineți imediat o notificare de eroare. Apăsând săgeata sus (sau, în interpretorul FreeCAD CTRL+Săgeată sus), puteți merge înapoi la ultima comandă și să o scrieți corect.

Interpretorul Python dispune de asemenea de un sistem integrat de help. Încercați să tastați:

help

sau, de exemplu, sa spunem ca nu ințelegem ce a mers prost cu comanda de afișare a lui ”hello” de mai sus, dorim informații mai precise despre comanda "print":

help("print")

Veți obține o descriere lungă și completă a tot ceea ce poate face comanda ”print”.

Acum că stăpânim total interpretorul nostru , putem începe lucrurile serioase.

Varibile

Desigur, tipărirea lui "hello" nu este foarte interesantă. Mai interesant este să imprimați lucruri pe care nu le cunoșteați înainte sau să lăsați Python să le găsească pentru dvs. Aici vine conceptul de variabilă. O variabilă este pur și simplu o valoare pe care o stocați sub un nume. De exemplu, tastați:

a = "hello"
print a

Presupun că ați înțeles ce sa întâmplat, am "salvat" șirul "hello" într-o variabilă care poartă numele "a". Acum, "a" nu mai este un nume necunoscut! Putem să o folosim oriunde, de exemplu în comanda de afișare pe ecran. Putem folosi orice nume dorim, trebuie doar să urmați câteva reguli simple, cum ar fi nu folosiți spații sau punctuație. De exemplu, am putea scrie:

hello = "my own version of hello"
print hello

Vedeți? acum hello nu mai este un cuvânt nedefinit. Dacă, printr-un ghinion teribil, alegem un nume care există deja în Python? Să presupunem că dorim să stocăm șirul nostru sub numele "print":

print = "hello"

Python este foarte inteligent și ne va spune că acest lucru nu este posibil. Are câteva cuvinte cheie "rezervate" care nu pot fi modificate. Dar variabilele noastre pot fi modificate oricând, de aceea se numesc variabile, conținutul poate varia. De exemplu:

myVariable = "hello"
print myVariable
myVariable = "good bye"
print myVariable

Noi am schimbat valoarea myVariable. Putem copia de asemenea variabile:

var1 = "hello"
var2 = var1
print var2

Rețineți că este important să oferiți nume descriptive variabilelor dvs. După un timp, nu vă veți aminti ce reprezintă variabila numită "a". Dar dacă l-ați numit, de exemplu, myWelcomeMessage, îți vei aminti cu ușurință scopul. Plus codul dvs. este un pas mai aproape de a fi auto-documentare.

Cazul este foarte important. myVariable nu este aceeași cu myvariable, diferența dintre majuscule / minuscule 'v' . Dacă trebuia să introduceți "print myvariable", s-ar întoarce cu o eroare pentru că nu a fost definită.

Numere

Desigur, trebuie să știți că programarea este utilă pentru a trata toate tipurile de date, și mai ales numere, nu numai șiruri de text. Un lucru este important, Python trebuie să știe cu ce fel de date are de-a face. Am văzut în exemplul nostru de afișarea a lui ”hello”, că comanda de afișare a recunoscut șirul de caractere "hello". Acest lucru se datorează faptului că prin utilizarea ghilimelelor " ", am spus în mod specific că această comanda de afișare va trata un șir de caractere alfabetice (text).

Întotdeauna putem verifica tipul de date al unei variabile folosind cuvântul cheie special Python type():

myVar = "hello"
type(myVar)

Aceasta ne va spune că conținutul lui myVar este 'str', scurt pentru șir în jargonul Python. De asemenea, avem și alte tipuri de date de bază, cum ar fi numere întregi (integer) și cu virgulă flotantă (float)

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

Acest lucru este mult mai interesant, nu-i așa? Acum avem un calculator puternic! Uită-te la cât de bine funcționează, Python știe că 10 și 20 sunt numere întregi. Deci, ele sunt stocate ca "int", iar Python poate face cu ele tot ce poate face cu numere întregi. Uită-te la rezultatele de acest lucru:

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

Vedeți? L-am forțat pe Python să considere că cele două variabile nu sunt numere, ci simple piese de text. Python poate adăuga două bucăți de text împreună, dar nu va încerca să afle nici o sumă. Dar am vorbit despre numere întregi. Există și numere cu virgulă. Diferența este că numerele întregi nu au o parte zecimală, în timp ce numerele cu virgulă flotantă pot avea o parte zecimală:

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

Int și Floats pot fi amestecate fără probleme:

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

Desigur, totalul are zecimale, nu? Apoi, Python a decis automat că rezultatul este un număr cuzecimale. În mai multe cazuri, cum ar fi acesta, Python decide automat ce tip este de utilizat. În alte cazuri, nu. De exemplu:

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

Acest lucru ne va da o eroare, varA este un șir și varB este un int, iar Python nu știe ce să facă. Cu toate acestea, putem forța Python să convertească între tipuri:

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

Acum, ambele sunt șiruri, operația funcționează! Rețineți că am "convetit" varB în șir la momentul afișării, dar nu am schimbat varB în sine. Dacă vrem să transformăm varB permanent într-un șir, ar trebui să o facem așa:

varB = str(varB)

Putem de asemenea să utilizăm int() și float() pentru a converti în întreg și cu virgulă mobilă dacă dorim:

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

Notă asupra comenzilor Python

Probabil că ați observat că în această secțiune am folosit comanda de afișare în mai multe moduri. Am tipărit variabile, sume, mai multe lucruri separate prin virgule și chiar rezultatul altor comenzi Python, cum ar fi type(). Poate că ați văzut de asemenea că făcând aceste două comenzi,

type(varA)
print type(varA)

avem exact același rezultat. Asta pentru că suntem în interpretor și totul este afișat automat. Când scriem programe mai complexe care rulează în afara interpretorului, nu se vor imprima automat, deci va trebui să folosim comanda de afișare. De acum încolo, haideți să-l oprim aici, va merge mai repede. Deci putem scrie pur și simplu:

myVar = "hello friends"
myVar

Probabil că ați văzut că majoritatea comenzilor Python (sau cuvintelor cheie) de tip (), int (), str (), etc. au paranteze pentru a limita conținutul comenzii. Singura excepție este comanda de afișare, care de fapt nu este o excepție, deoarece funcționează și în mod normal: tipăriți ("hello"). Cu toate acestea, deoarece este folosit des, designerii Python au permis o versiune mai simplă.

Liste/matrici

Un alt tip de date interesant este formată de către liste. O listă este pur și simplu o colecție de alte date. În același mod în care definim un șir de text folosind "", definim o listă folosind []:

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

Vedeți că poate conține orice tip de date. Listele sunt foarte utile deoarece puteți grupa împreună variabilele. Puteți face apoi tot felul de lucruri din cadrul grupului, de exemplu, numărarea acestora:

len(myOtherList)

sau recuperarea unui articol dintr-o listă:

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

Veți vedea că în timp ce comanda len () returnează numărul total de elemente dintr-o listă, poziția lor din listă începe cu 0. Primul element dintr-o listă este întotdeauna la poziția 0, așa că în "myOtherList", "Bob" va fi în poziția 2. Putem face mult mai mult cu listele, puteți citi here, ca de exemplu sortarea conținutului, ștergerea sau adăugarea elementelor.

Un lucru amuzant și interesant este acela că: un șir de text este foarte asemănător cu o listă de caractere! Încercați să faceți acest lucru:

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

De obicei, ceea ce puteți face cu listele se poate face și cu șiruri de caractere. De fapt, atât listele cât și șirurile sunt secvențe pe care Python le vede în aceeași manieră.

Outside strings, ints, floats and lists, există mai multe tipuri de date încorporate, cum ar fi dictionaries, sau care le puteți crea ca pe propriile tipuri de date cu classes.

Indentation

O mare utilizare rece a listelor este, de asemenea, navigarea prin ele și să facă ceva cu fiecare element. De exemplu, uitați-vă la acest lucru:

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

Am iterat(jargonul informatic) prin lista noastră cu comanda "for ... in ..." și am făcut ceva cu fiecare dintre ele. Rețineți sintaxa specială: comanda for se termină cu : indicând că următorul lucru va fi un bloc al uneia sau mai multor comenzi. În interpretor, imediat după ce ați introdus linia de comandă care se termină cu:, promptul de comandă se va schimba la ... Notați sintaxa particulară a buclei , comanda se termină cu un " : " ceea ce indică lui Python că urmarea va fi un bloc de una sau mai multe comenzi.

Cum va ști Python câte linii vor fi executate în interiorul buclei FOR ... IN ? Pentru asta, Python utilizează indentare. Adică liniile următoare nu vor începe imediat. Veți începe cu un spațiu gol sau mai multe spații goale sau un tab sau câteva tabs. Alte limbaje de programare utilizează alte metode, cum ar fi punerea totul în paranteză etc. Atâta timp cât scrieți liniile următoare cu aceeași indentare same , ele vor fi considerate parte a blocului for-in. Dacă începeți o linie cu 2 spații și următoarea cu 4, va exista o eroare. Când ați terminat, scrieți o altă linie fără indentare sau apăsați pe Enter pentru a reveni din blocul for-in.

Indentarea este cool, deoarece ajută la lizibilitatea programului. Dacă utilizați indentări mari (de exemplu, utilizați tabs în loc de spații deoarece este mai mare), atunci când scrieți un program mare, veți avea o imagine clară a ceea ce este executat în interiorul a buclei for-in. Vom vedea că comenzile, altele decât cele for-in, pot avea și blocuri de cod.

Comenzile for-in pot fi folosite pentru mai multe lucruri care trebuie efectuate mai mult decât o dată. Acesta poate fi, de exemplu, combinat cu comanda range():

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

(Dacă ați executat exemplele de cod într-un interpretor prin copy and paste, veți găsi că blocul anterior de text vă va arunca o eroare în față. În schimb, copiați la sfârșitul blocului indentat, adică sfârșitul liniei "" total = total + number "și apoi lipiți la interpretor păsați pe <enter> până până la dispariția promptului cu trei puncte și codul se execută Apoi, copiați ultimele două linii în interpretor urmate de una sau mai multe <enter> ar trebui să apară răspunsul final.)

Dacă veți tasta în interpretor help(range) veți vedea:

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

Aici parantezele pătrate denotă un parametru opțional. Totuși tot ce se așteptă este să fie numere întregi. Mai jos vom forța parametrii domeniului să fie un număr întreg folosind int()

decimales = 1000                     # for 3 decimales 
#decimales = 10000                   # for 4 decimales ...
for i in range(int(0 * decimales),int(180 * decimales),int(0.5 * decimales)):
    print float(i) / decimales

Sau lucruri mai complexe ca de exemplu:

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

Vedeți că și comanda range () are acea particularitate ciudată că începe cu 0 (dacă nu specificați numărul de început) și că ultimul său număr va fi unul mai mic decât numărul de sfârșit pe care îl specificați. Aceasta este, bineînțeles, așa pentru că funcționează bine cu alte comenzi Python. De exemplu:

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

O altă utilizare interesantă a blocurilor indentate este cu comanda if. IF execută un bloc de cod numai dacă o anumită condiție este îndeplinită, de exemplu:

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

Desigur, aceasta va imprima întotdeauna prima propoziție, dar încercați să înlocuiți a doua linie prin:

if "Lucky" in alldaltons:

Apoi nimic nu este afișat. De asemenea, putem specifica o altă afirmație

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

Funcții

Sunt câteva comenzi standard standard Python commands. În versiunea actuală a Python, există aproximativ 30, iar noi deja știm mai multe dintre ele. Dar imaginați-vă dacă am putea să ne inventăm propriile comenzi? Ei bine, putem, și este extrem de ușor. De fapt, majoritatea modulelor suplimentare pe care le puteți conecta la instalarea dvs. Python faceți exact acest lucru, adăugând comenzi pe care le puteți utiliza. O comandă personalizată în Python se numește o funcție și se face astfel:

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

(O altă eroare de copy and paste, copiați numai prin sfârșitul secțiunii indentate, adică "metri pătrați" . Inserați în interpretor și apăsați <enter> până când promptul cu trei puncte dispare, apoi copiați și lipiți linia finală.)

Extrem de simplu: comanda def () definește o nouă funcție. Dă-i un nume, iar în paranteză definiți argumente pe care le vom folosi în funcția noastră. Argumentele sunt date care vor fi transmise funcției. De exemplu, uitați-vă la comanda len (). Dacă scrieți len () singur, Python vă va spune că are nevoie de un argument. Asta este, vrei len () ceva, nu? Apoi, de exemplu, veți scrie len (myList) și veți obține lungimea myList. Ei bine, lista mea este un argument să-l treci la funcția len (). Funcția len () este definită astfel încât să știe ce să facă cu ceea ce este transmis acesteia. La fel cum am făcut aici.

Numele "myValue" poate fi orice, și va fi utilizat numai în interiorul funcției rexpective. Este doar un nume pe care îl oferiți argumentului, astfel încât să puteți face ceva cu el, dar servește și pentru a spune funcției câte argumente să așteptați. De exemplu, dacă faceți acest lucru:

printsqm(45,34)

Va exista o eroare. Funcția noastră a fost programată să primească un singur argument, dar a primit două, 45 și 34. Am putea să facem ceva în felul următor:

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

sum(45,34)
myTotal = sum(45,34)

Am făcut o funcție care primește două argumente, le însumează și returnează acea valoare. Returnarea a ceva este foarte utilă, deoarece putem face ceva cu rezultatul, cum ar fi stocarea în variabila myTotal. Bineînțeles, din moment ce suntem în interpretor și totul este afișat, faci:

sum(45,34)

va imprima rezultatul pe ecran, dar în afara interpretului, deoarece nu există nici o comandă de imprimare în interiorul funcției, nimic nu ar apărea pe ecran. Va trebui să:

print sum(45,34)

pentru a avea ceva afișat, Citiți mai multe despre funcțiile here.

Module

Acum că avem o idee completă de cum lucrează Python, vom avea nevoie de un ultim lucru: Cum să lucrăm cu fișiere și cu module.

Până acum, am scris linii de instrucțiuni Python în linie în interpretor, nu-i așa? Dacă am putea scrie câteva rânduri împreună și le-am fi executat imediat? Cu siguranță ar fi mai ușor să facem lucruri mai complexe. Și ne-am putea salva munca. Și asta este extrem de ușor. Pur și simplu deschideți un editor de text (cum ar fi notepad-ul din Windows, sub Linux: gedit, emacs sau vi) și scrieți toate liniile dvs. Python, la fel cum le scrieți în interpretor, cu indentări etc. , Apoi salvați fișierul undeva, de preferință cu o extensie .py. Asta e, aveți un program Python complet. Desigur, există editori mult mai buni decât notepad-ul, dar aceasta este doar să vă arătăm că un program Python nu este altceva decât un fișier text.

Pentru a face Python să execute acel program, există sute de moduri. În Windows, pur și simplu faceți clic dreapta pe fișierul dvs., deschideți-l cu Python și executați-l. Dar o puteți executa și din interpretorul Python. Pentru aceasta, interpretorul trebuie să știe unde este programul dvs. .py. În FreeCAD, cel mai simplu mod este să plasați programul într-un loc în care interpretul Python al FreeCAD îl cunoaște în mod implicit, ca de exemplu FreeCAD's bin folder, sau orice folder Mod. (In Linux, aveți probabil un director /home/<username>/.FreeCAD/Mod, haideți să-i adăugăm un subdirector to that called scripts unde vom pune fișierul text.) Presupunem că scriem fișierul de maniera:

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

print "myTest.py succesfully loaded"

Și noi salvăm asta ca pe myTest.py în direcotrul nostru FreeCAD/bin directory (sau în Linux la /home/<username>/.FreeCAD/Mod/scripts.) Acum , hai să pornim FreeCAD, și în fereastra interpretorului, scrie :

import myTest

fără extensia .py . Aceasta va executa pur și simplu conținutul fișierului, linie cu linie, ca și cum l-am fi scris în interpret. Se va crea funcția sumă, iar mesajul va fi imprimat. Există o mare diferență: comanda de import este făcută nu numai pentru a executa programe scrise în fișiere, ca și pentru ale noastre, dar și pentru a încărca funcțiile din interior, astfel încât acestea să devină disponibile în interpretor. Fișierele care conțin funcții, precum cele ale noastre, sunt numite module.

În mod normal când scrii o funcție sum() in interpreter, noi o executăm simplu ca:

sum(14,45)

La el am făcut și noi. Atunci când importăm un modul care conține funcția sum(), sintaxa este puțin diferită. Noi facem:

myTest.sum(14,45)

Asta e, modulul este importat ca un "container", și cu toate funcțiile sale în interior. Acest lucru este extrem de util, deoarece putem importa o mulțime de module și să păstrăm totul bine organizat. Deci, practic, oriunde vedeți something.somethingElse, cu punct între, asta înseamnă că somethingElse este în interiorul lui something.

De asemenea, putem importa funcția sum() direct în spațiul principal al interpretorului, astfel:

from myTest import *
sum(12,54)

Practic, toate modulele se comportă așa. Importați un modul, apoi puteți utiliza funcțiile sale: module.function(argument). Aproape toate modulele fac acest lucru: definesc funcții, noi tipuri de date și clase pe care le puteți utiliza în interpretor sau în propriile module Python, deoarece nimic nu vă împiedică să importați alte module în modulul dvs.!

Un ultim lucru extrem de util. Cum știm ce module avem, ce funcții există și cum să le folosim (adică, ce argumente au nevoie)? Am văzut deja că Python are o funcție help(). Face:

help()
modules

Ne va da o lista cu toate modulele disponibile. Acum putem introduce q pentru a ieși din ajutorul interactiv și pentru a importa oricare dintre ele. Putem chiar să răsfoim conținutul lor cu comanda dir()

import math
dir(math)

Vom vedea toate funcțiile conținute în modulul de matematică, precum și lucruri ciudate named __doc__, __file__, __name__. The __doc__ is extrem de utili, este un text de comentariu. Orice funcție a unui modul binefăcut are a __doc__ that care explică cum se folosește. De exemplu, vedem că este o funcție sin în interiorul modului de matematică. Vreți să știți cum se folosește?

print math.sin.__doc__

(Este posibil să nu fie evident, dar din ambele părți ale docului există două caractere subliniate.)

Și în cele din urmă o bombonică: Când lucrăm la un modul nou sau existent, este mai bine să înlocuiți extensia de fișier cu py cum ar fi: myModule.FCMacro => myModule.py. Vrem adesea să o testeze astfel încât să o încărcăm ca mai sus.

import myModule
myModule.myTestFunction()

Dar dacă vedem că myTestFunction() nu funcționează corect? Ne întoarcem la editorul nostru și facem schimbări. Apoi, în loc să închidem și să redeschidem interpretul python, putem să actualizăm modulul astfel:

reload(myModule)

Acest redenumire de fișiere se datorează faptului că Python nu știe despre extensia FCMacro.

Cu toate acestea, există două alternative: în cadrul macro-ului se utilizează funcțiile exec sau execfile ale lui Python.

f = open("myModule","r")
d = f.read()
exec d

ori

execfile "myModule"

For Python 3.xxx replace this code with:

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

Pentru a partaja codul între macrocomenzi, puteți accesa modulul FreeCAD sau FreeCADGui (sau orice alt modul Python) și puteți seta orice atribut la acesta. Acest lucru ar trebui să supraviețuiască executării macrocomenzii.

import FreeCAD
if hasattr(FreeCAD,"macro2_executed"):
    ...
else:
    FreeCAD.macro2_executed = True # you can assign any value because we only check for the existence of the attribute
    ... execute macro2

Începeți cu FreeCAD

Ei bine, cred că acum aveți o idee bună despre modul în care funcționează Python și puteți începe să explorați ce oferă FreeCAD. Funcțiile Python ale FreeCAD sunt bine organizate în diferite module. Unele dintre ele sunt deja încărcate (importate) când porniți FreeCAD. Deci, pur și simplu

dir()

și citiți pe FreeCAD Scripting Basics.

Desigur, am văzut aici doar o mică parte a lumii Python. Există multe concepte importante pe care nu le-am menționat. Există trei documente de referință Python foarte importante pe net:

Asigurați-vă că le marcați!



Programarea script Python in FreeCAD

FreeCAD este construit de la zero pentru a fi controlat total de scripturile Python. Aproape toate componentele FreeCAD, cum ar fi interfața, conținutul scenelor și chiar reprezentarea acestui conținut în vizualizările 3D, sunt accesibile din interpretorul Python încorporat sau din propriile dvs. scripturi. Drept urmare, FreeCAD este probabil una dintre aplicațiile de inginerie cele mai profunde disponibile astăzi.

În starea sa actuală însă, FreeCAD are foarte puține comenzi "native" pentru a interacționa cu obiectele 3D, în principal pentru că se află încă în stadiu incipient de dezvoltare, dar și pentru că filozofia din spatele ei este mai degrabă o platformă pentru dezvoltarea CAD decât o aplicație specifică de utilizare. Dar ușurința scripturilor Python din cadrul FreeCAD este o modalitate rapidă de a vedea noi funcționalități dezvoltate de "utilizatorii de putere", de obicei utilizatorii care cunosc un pic de programare Python. Python este una dintre cele mai cunoscute limbi interpretate și, în general, este considerată ușor de învățat, și tu în curând poți crea propriile script-uri de utilizator ale PowerCAD.

Dacă nu sunteți familiarizat cu Python, vă recomandăm să căutați tutoriale pe internet și să vă aruncați o privire rapidă asupra structurii sale. Python este un limbaj de programare foarte ușor de învățat, mai ales pentru că poate fi rulat în interiorul unui interpretor, unde comenzile simple, chiar până la finalizarea programelor, pot fi executate în zbor fără a fi nevoie să compilați nimic. FreeCAD are un interpretor Python încorporat. Dacă nu vedeți fereastra etichetată "Consola Python" așa cum se arată mai jos, o puteți activa sub consola View -> Panels -> Python pentru a deschide interpretorul.

Interpretorul

Din interpretor, puteți accesa toate modulele Python instalate de sistem, precum și modulele FreeCAD încorporate și toate modulele FreeCAD suplimentare instalate ulterior. Imaginea de mai jos prezintă interpretorul Python:

The FreeCAD Python interpreter

Din interpretor, puteți executa codul Python și puteți naviga prin clasele și funcțiile disponibile. FreeCAD oferă un browser al claselor foarte util pentru explorarea noii tale lumi FreeCAD: Când introduceți numele unei clase cunoscute, urmată de un punct (adică doriți să adăugați ceva din acea clasă), se deschide o fereastră de browser de clasă, unde puteți naviga între subclasele și metodele disponibile. Când selectați ceva, este afișat un text de ajutor asociat (dacă există):

The FreeCAD class browser

Așa că, începeți aici tastând App. ori Gui. și priviți ce e tâmplă. O altă modalitate mai generală de a explora conținutul modulelor și claselor este utilizarea comenenzii Python'print dir()'. De exemplu, tastați print dir() și veți obține o listă a tuturor modulelor încărcat curent în FreeCAD. print dir(App) vă va arăta tot ceea ce este în interiorul modulelro App, etc.

O altă caracteristică utilă a interpretului este posibilitatea de a reveni prin istoria comenzilor și de a recupera o linie de cod pe care ați introdus-o deja mai devreme. Pentru a naviga prin istoricul comenzilor, trebuie doar să le utilizați CTRL+UP or CTRL+DOWN.

Dacă faceți clic dreapta în fereastra interpretului, aveți și alte câteva opțiuni, cum ar fi copierea întregului istoric (util atunci când doriți să experimentați lucrurile înainte de a face un script complet al acestora) sau introduceți un nume de fișier cu cale completă.

Python Help

În meniul de ajutor al FreeCAD veți găsi o intrare intitulată "Ajutor Python", care va deschide o fereastră de browser care conține o documentație completă, generată în timp real, a tuturor modulelor Python disponibile pentru interpretorul FreeCAD, inclusiv modulele Python și FreeCAD încorporate , modulele instalate în sistem și modulele suplimentare FreeCAD. Documentația disponibilă depinde de efortul fiecărui dezvoltator de module în documentarea codului său, dar, de obicei, modulele Python au o reputație de a fi destul de bine documentate. Fereastra FreeCAD trebuie să rămână deschisă pentru ca acest sistem de documentare să funcționeze.

Module integrate

Deoarece FreeCAD este proiectat să ruleze fără o interfață grafică de utilizator (GUI), aproape toate funcționalitățile sale sunt separate în două grupuri: funcționalitatea Core, numită "App", și funcționalitatea GUI, numită "Gui". Deci, cele două module principale FreeCAD încorporate se numesc App și Gui. Aceste două module pot fi accesate, de asemenea, din scripturile din afara interpretului, prin numele "FreeCAD" și respectiv "FreeCADGui".

  • In App module, veți găsi totul în legătură cu aplicația în sine, cum ar fi metodele de deschidere sau închidere a fișierelor și documentelor, cum ar fi setarea documentului activ sau listarea conținutului acestuia.
  • In Gui module, veți găsi instrumente pentru accesarea și gestionarea elementelor Gui, cum ar fi Atelierele de lucru și barele lor de instrumente și, mai interesant, reprezentarea grafică a conținutului FreeCAD.

Afișarea întregului conținut al acestor module este o sarcină puțin contraproductivă, deoarece acestea cresc destul de repede cu dezvoltarea FreeCAD. Dar cele două instrumente de navigare furnizate (browserul de clasă și Python help) vă vor oferi, în orice moment, o documentație completă și actualizată a acestor module.

Obiectele App și Gui

Așa cum am spus, în FreeCAD, totul este separat între nucleu și reprezentare. Aceasta include și obiectele 3D. Puteți accesa definirea proprietăților obiectelor (numite funcții în FreeCAD) prin modulul App și modificați modul în care sunt reprezentate pe ecran prin modulul Gui. De exemplu, un cub are proprietăți care îl definesc (cum ar fi lățimea, lungimea, înălțimea) stocate într-un obiect App și proprietăți de reprezentare (cum ar fi culoarea fețetelor, modul de desenare) stocate într-un obiect Gui corespunzător.

Acest mod de a face lucrurile permite o gamă largă de utilizări, cum ar fi ca algoritmii să funcționeze numai pe partea de definire a caracteristicilor, fără a avea nevoie să aibă grijă de nicio parte vizuală sau chiar să redirecționeze conținutul documentului la o aplicație non-grafică ca liste, foi de calcul sau analiza elementului finit.

Pentru fiecare obiect App din document, există un obiect Gui corespunzător. De fapt documentul în sine are atât obiecte App cât și obiecte Gui. Acest lucru, desigur, este valabil numai când rulați FreeCAD cu interfața sa completă. În versiunea de linie de comandă nu există nici o interfață grafică, astfel încât numai obiectele App sunt disponibile. Rețineți că partea Gui a obiectelor este re-generată de fiecare dată când un obiect App este marcat ca fiind "pentru a fi recalculat" (de exemplu, când unul dintre parametrii lui se modifică), astfel încât modificările pe care le-ați fi putut face direct la obiectul Gui pot fi pierdute.

Pentru a acesa partea App a unui obiect oarecare, scrieți:

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

unde "ObjectName" este numele obiectului dvs. Puteți de asemenea tasta:

myObject = App.ActiveDocument.ObjectName

Pentru a accesa partea Gui a aceluiași obiect, scrieți:

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

unde "ObjectName" este numele obeictului duvs. Puteți de asemena tasta:

myViewObject = App.ActiveDocument.ObjectName.ViewObject

Dacă nu aveți nici un GUI (de exemplul sunten în modul linie-de-comandă), ultima linie va returna 'None'.

Obiectele Documentului

În FreeCAD, toată munca dvs. se află în interiorul Documentelor. Un document conține geometria și poate fi salvat într-un fișier. Mai multe documente pot fi deschise în același timp. Documentul, ca geometria conținută în interior, are obiecte App și Gui. Obiectul App conține definițiile de geometrie reale, în timp ce obiectul Gui conține vederile diferite ale documentului. Puteți deschide mai multe ferestre, fiecare vizionând munca dvs. cu un alt factor de zoom sau unghi de vedere diferit. Aceste viziuni fac parte din obiectul Gui al documentului dvs.

Pentru a accesa partea App a documentului curent deschis (activ), scrieți:

myDocument = App.ActiveDocument

Pentru a crea un nou documente, scrieți:

myDocument = App.newDocument("Document Name")

Pentru a accesa partea Gui documentul deschis (activ), tastați:

myGuiDocument = Gui.ActiveDocument

Pentru a accesa vederea curentă, scrieți:

myView = Gui.ActiveDocument.ActiveView

Utilizarea de module adiționale

Modulele FreeCAD și FreeCADGui sunt singurele responsabile pentru crearea și gestionarea obiectelor din documentul FreeCAD. Ele nu fac de fapt nimic, cum ar fi crearea sau modificarea geometriei. Aceasta deoarece această geometrie poate fi de mai multe tipuri și astfel este gestionată de module suplimentare, fiecare responsabil pentru gestionarea unui anumit tip de geometrie. De exemplu, Part Module utilizează kernelul OpenCascade și, prin urmare, este capabil să creeze și să manipuleze B-rep type geometry, ceea ce este construit pentru OpenCascade. Modul Mesh Module poate construi și modifica obiecte tip plase. În acest fel, FreeCAD este capabil să gestioneze o mare varietate de tipuri de obiecte, care pot coexista în același document, iar noi tipuri pot fi adăugate cu ușurință în viitor.

Crearea obiectelor

Fiecare modul are propriul mod de a trata geometria sa, dar un lucru pe care, de obicei, pot să-l facă este să creeze obiecte în document. Dar documentul FreeCAD este, de asemenea, conștient de tipurile de obiecte disponibile furnizate de module:

FreeCAD.ActiveDocument.supportedTypes()

vă va lista toate obiectele posibile pe care le puteți crea. De exemplu, să creăm o plasă (tratată de modulul Mesh/Plasă) și o Piesă (tratată de modulul Part/Piesă):

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

Primul argument este tipul de obiect, al doilea este numele obiectului. Cele două obiecte arată aproape la fel: nu conțin încă nicio geometrie și majoritatea proprietăților lor sunt aceleași când le inspectați cu dir(myMesh) și dir(myPart). Cu o excepție, myMesh are o proprietate "Mesh" și "Part" are o proprietate "Shape". Acesta este locul în care sunt stocate datele de Plasă și Piesă. De exemplu, să creăm un cub Part și să îl stocăm în obiectul myPart:

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

Puteți încerca să stocați cubul în interiorul proprietății Mesh-ului obiectului myMesh, va veni o eroare în care se plânge despre tipul greșit. Aceasta se datorează faptului că aceste proprietăți sunt făcute pentru a stoca numai un anumit tip. În proprietatea MyMesh a Mesh, puteți salva numai chestii create cu modulul Mesh. Rețineți că majoritatea modulelor au, de asemenea, o comandă rapidă pentru a adăuga geometria lor la document:

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

Modificarea obiectelor

Modificarea unui obiect este făcută în același mod:

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

Acum, să schimbăm forma printr-o formă mai mare:

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

Interogarea obiectelor

Puteți să vă uitați mereu la tipul de obiect ca acesta:

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

sau să știm dacă un obiect este derivat dintr-unul dintre cele de bază (Part Feature, Mesh Feature, etc):

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

Acum puteți începe să jucați cu FreeCAD! Pentru a vedea ce puteți face cu Part Module, citiți pagina Pare scripting, sau pagina Mesh Scriptingpentru a lucra cu Mesh Module.Rețineți că, deși modulele Parte și Mesh sunt cele mai complete și utilizate pe scară largă, alte module cum ar fi Draft Module au, de asemenea, scripting APIs care vă pate fi utili.Pentru o listă completă a fiecărui modul și a instrumentelor disponibile, vizitați secțiunea Category:API.



Introducere

Înainte de toate trebuie să importați un modul Mesh:

import Mesh

după ce aveți acces la un modul Mesh și clasa Mesh care ușurează funcțiile FreeCAD C++ Mesh-Kernel.

Creație și Încărcare

Pentru a crea un obiectr vid Plasă utilizați construcția standard:

mesh = Mesh.Mesh()

Puteți crea un obiect din fișierul

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

(o listă a tipurilor de fișiere compatibile poate fi găsită sub 'Meshes' here.)

Sau o creați dintr-un set de triunghiuri descris de către punctele de colț:

planarMesh = [
# 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],
]
planarMeshObject = Mesh.Mesh(planarMesh)
Mesh.show(planarMeshObject)

Mesh-Kernel are grijă de o structură topologică corectă a datelor prin sortare

împreună a punctelor și marginilor coincidente. 

Mai târziu veți vedea cum se poate testa și examina datele Plasei/Mesh.

Modelare

Pentru a crea geometrii obișnuite, puteți utiliza scriptul Python BuildRegularGeoms.py.

import BuildRegularGeoms

Acest script oferă metode pentru definirea corpurilor simple rotative cum ar fi sfere, elipsoide, cilindri, toroide și conuri. Și are de asemenea o metodă de a crea un cub simplu. Pentru a crea un toroid, de exemplu, se poate face după cum urmează:

t = BuildRegularGeoms.Toroid(8.0, 2.0, 50) # list with several thousands triangles
m = Mesh.Mesh(t)

Primii doi parametri definesc razele toroidului, iar al treilea parametru este un factor de subeșantionare pentru câte triunghiuri sunt create. Cu cât această valoare este mai mare cu atât este mai lină și cu cât este mai groasă corpul. Clasa Mesh oferă un set de funcții booleene care pot fi utilizate în scopuri de modelare. Oferă uniune, intersecție și diferență de două obiecte de plasă.

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

În cele din urmă, un exemplu complet al intersecției între o sferă și un cilindru care intersectează sfera.

import Mesh, BuildRegularGeoms
sphere = Mesh.Mesh( BuildRegularGeoms.Sphere(5.0, 50) )
cylinder = Mesh.Mesh( BuildRegularGeoms.Cylinder(2.0, 10.0, True, 1.0, 50) )
diff = sphere
diff = diff.difference(cylinder)
d = FreeCAD.newDocument()
d.addObject("Mesh::Feature","Diff_Sphere_Cylinder").Mesh=diff
d.recompute()

Examinând și Testând

Scrieți-vă proprii algoritmi

Exportare

Puteți scrie o plasă la un modul python:

m.write("D:/Develop/Projekte/FreeCAD/FreeCAD_0.7/Mod/Mesh/SavedMesh.py")
import SavedMesh
m2 = Mesh.Mesh(SavedMesh.faces)

Interfața grafică

Odds and Ends

O extensie (deși greu de folosit) de scripting Mesh sunt script-urile de testare a Mesh-Module. În această unitate se fac toate testele de compilare și sunt manipulate toate proprietățile și atributele. Cine are curaj îndeajuns, poate privi la Unit Test module.

See also Mesh API


Base ExampleCommandModel.png Tutorial

Topic
Programming
Level
Intermediate
Time to complete
Author
FreeCAD version
Example File(s)



Această pagină descrie mai multe metode pentru crearea și modificarea modulelor Forms of parts din Python. Înainte de a citi această pagină, dacă sunteți nou la Python, este o idee bună să citiți despre python scripting and how python scripting works in FreeCAD.

Introducere

Aici vă vom explica cum să controlați Part Module direct de la interpretorul FreeCAD Python sau de la orice script extern. Elementele de bază despre programarea script datelor topologice sunt descrise în Part Module Explaining the concepts. fiți siguri că a-ți răsfoit secțiunea Scripting și paginile FreeCAD Scripting Basics dacă aveți nevoie de mai multe informații despre cum funcționaează programarea python in FreeCAD.

Class Diagram

Aceasta Unified Modeling Language (UML) o trecere în revistă a celor mai importante clase a modului Piese:

Python classes of the Part module

Geometrie

Obiectele geometrice reprezintă blocul de construcție al tuturor obiectelor topologice:

  • Geom Clasă de bază a obiectelor geometrice
  • Line o linie dreaptă în 3D, definită de punctul de plecare și de cel de sosire
  • Circle Cerc sau arc de cerc definit prin centru și punctele de start și de finiș
  • ...... Și în curând mai multe

Topologie

Următoarele date topologice sunt disponibile:

  • Compound Un grup al oricărui tip de obiect topologic.
  • Compsolid Un solid compozit este un set de solide conectate prin fațetele lor. Extinde noțiunile de WIRE și SHELL la solide.
  • Solid O partea a spațiului limitată de cochilii. Are trei dimensiuni
  • Shell Un set da fațete conectate prin muchiile lor. O cochilie poate fi deschisă sau închisă.
  • Face In 2D este o parte a unui plan; in 3D este o parte a unei suprafețe.

Geometria sa este constrânsă(tăiată) de contururi. Este bidimensională.

  • Wire Un set de margini conectate prin vârfurile lor. Poate fi un contur deschis sau închis, în funcție de faptul dacă marginile sunt legate sau nu.
  • Edge Un element topologic corespunzător unei curbe reținute. O margine este în general limitată de vârfuri. Este unidimensională.
  • Vertex Un element topologic corespunzător unui punct. Are dimensiune zero.
  • Shape Un termen generic care acoperă toate cele de mai sus.

Exemplul rapid: crearea unei topologii simple

Wire


Acum vom crea o topologie construind-o din geometrie mai simplă. Ca studiu de caz, folosim o parte din imaginea din care face parte patru vârfuri, două cercuri și două linii.

Crearea Geometriei

Mai întâi trebuie să creăm părțile geometrice distincte ale acestui fir. Și trebuie să avem grijă de vârfurile părților geometrice se se afle în aceeași poziție. Altfel, mai târziu, s-ar putea să nu fim capabil să conectăm părțile geometrice la o topologie!

Așa creăm primul dintre puncte:

from FreeCAD import Base
V1 = Base.Vector(0,10,0)
V2 = Base.Vector(30,10,0)
V3 = Base.Vector(30,-10,0)
V4 = Base.Vector(0,-10,0)

Arc

Circle


Pentru a crea un arc de cerc vom face un punct ca reper și vom crea arcul de cerc prin trei puncte:

VC1 = Base.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
# and the second one
VC2 = Base.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)

Linie

Line


Segmentul de linie poate fi creat foarte simplu din punctele:

L1 = Part.LineSegment(V1,V2)
# and the second one
L2 = Part.LineSegment(V3,V4)

Notă: in FreeCAD 0.16 Part.Line a fost utilizată, pentru FreeCAD 0.17 Part.LineSegment va fi folosit

Punem totul laolaltă

Ultimul pas este de a conecta elementele geometrice de bază împreună într-o forma topologică:

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

Facem o prismă

Acum extrudem firul într-o direcție și facem o formă 3D :

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

Afișăm totul

Part.show(P)

Crearea formelor de bază

Puteți crea cu ușurință obiecte topologice de bază cu ajutorul funcției "Make ... ()" metode de la modulul Part:

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

Câteva metode disponibile de make...() :

  • makeBox(l,w,h): Construirea unui paralelipiped localizat în punctul p orientat în direcția d având dimensiunile (l,w,h)
  • makeCircle(radius): Construirea cercului cu o rază dată
  • makeCone(radius1,radius2,height): Construirea unui con cu (raza1,raza2,înălțime)
  • makeCylinder(radius,height): Construirea unui cilindru cunoscând raza și înălțimea.
  • makeLine((x1,y1,z1),(x2,y2,z2)): Construirea unei linii între 2 puncte
  • makePlane(length,width): construirea unui plan cunoscând lungimea și lățimea
  • makePolygon(list): construirea unui poligon având o listă de puncte
  • makeSphere(radius): Construirea unei sfere de rază dată
  • makeTorus(radius1,radius2): construirea unui torus cuoscând raza 1 și raza 2

Vezi pagina Part API pentru o listă completa a metodelor disponibile în modulul Part.

Importare modulelor necesare

Mai întâi trebuie să importăm modulul Part astfel încât să putem folosi conținutul său în Python. De asemenea, vom importa modulul Base din interiorul modulului FreeCAD:

import Part
from FreeCAD import Base

Crearea unui Vector

Vectorssunt una dintre cele mai importante piese de informații când construim forme geometrice. Acestea conțin 3 numere de obicei (dar nu este obligatoriu întotdeauna) coordonatele carteziene x, y și z. Creați un vector ca acesta:

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

Tocmai am creat un vector la coordonatele x = 3, y = 2, z = 0. În modulul Part, vectorii sunt folosiți peste tot. Formele de Piese utilizează de asemenea un alt tip de punct reprezentare, numită Vertex, care nu este nimic altceva decât un container pentru un vector. Accesați vectorul unui vârf ca acesta:

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

Crearea unei muchii

O margine nu este altceva decât o linie cu două vârfuri:

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

Notă: De asemenea, puteți crea o margine definită de doi vectori:

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

Puteți găsi lungimea și centrul unei muchii astfel:

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

Afișarea formei pe ecran

Până acum, am creat un obiect de margine, dar nu apare nicăieri pe ecran. Acest lucru se datorează faptului că doar am manipulat obiectele de tip python aici. Scena 3D FreeCAD afișează doar ceea ce îi spui să afișeze. Pentru a face acest lucru, folosim acest lucru simplu Pentru a realiza asta, utilizăm această metodă simplă:

Part.show(edge)

Un obiect va fi creat în documentul nostru FreeCAD, și forma noastră "muchie" va fi atribuită. Utilizați acest lucru când este timpul să vă afișați creație pe ecran.

Crearea unui fir/contur/polilinie

Un fir este o linie multi-margine și poate fi creat dintr-o listă de margini sau chiar o listă de fire:

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) va afișa cele 4 margini care compun firul/polilinia noastră. alte informațiile utile pot fi ușor recuperate:

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

Crearea unei Fațete

Doar fațetele create de firele/poliliniile închise vor fi valide. În acest exemplu, wire3 este un contur închis dar wire2 nu este un contur închis(vezi mai sus)

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

Numai fațetele vor avea o arie, poliliniile și muchiile nu posedă așa ceva.

Crearea unui Cerc

Un cerc poate fi creat pur și simplu astfel:

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

Dacă vreți să îl creați la o anumită poziție și într-o anumită direcție:

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

cercul va fi creat la distanța 10 unități de la axa x și va fi orientat spre axa x. Notă: makeCircle acceptă numai Base.Vector () pentru poziție și normal, dar nu tuple. Puteți, de asemenea, să creați o parte a cercului dând unghiul de pornire și unghiul de capăt ca de exemplu:

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

Ambele atât arc1 cât și arc2 vor face un cerc. Trebuie introduse unghiuri în grade, dacă aveți radiani pur și simplu le convertiți folosind formula: grade = radiani * 180 / PI sau folosind modulul matematic al lui python (după importul efectuat matematica, desigur):

degrees = math.degrees(radians)

Crearea unui Arc de-a lungul punctelor

Din păcate, nu există nicio funcție makeArc, dar avem funcția Part.Arc pentru a crea un arc de-a lungul a trei puncte. Practic, putem să ne imaginăm un arc de cerc atașat la un punct de plecare, trecând printr-un punct central și terminându-se într-un punct final. Part.Arc creează un obiect arc pe care .toShape() trebuie apelat pentru a obține un obiect muchie, în același mod ca atunci când utilizați Part.LineSegment în loc de Part.makeLine.

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

Arc only accepts Base.Vector() for points but not tuples. arc_edge is what we want which we can display using Part.show(arc_edge). You can also obtain an arc by using a portion of a circle:

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

Arcurile sunt muchii valide, ca liniile. Deci, ele pot fi folosite și în polilinii/contururi/fire.

Crearea unui poligon

Un poligon este o polilinie simplă cu multiple segemente de linii drepte. funcția makePolygon ia o listă de puncte și creează o polilinie de-a lungul acestor puncte:

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

Crearea unei curbe Bezier

Curbele Bézier sunt folosite pentru a modela curbele netede folosind o serie de repere (puncte de control) și cu un numar mare de reprezentari la precizie (fluiditatea curbei). Funcția de mai jos face Part.BezierCurve dintr-o serie de puncte FreeCAD.Vector. (Notă: indicele primului reper începe de la 1, și nu de la 0.)

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

Crearea unui Plan

A Plane este o suprafață simplă rectangulară. Meteoda pentru crearea unuia este aceasta: makePlane(length,width,[start_pnt,dir_normal]). Implicit start_pnt = Vector(0,0,0) and dir_normal = Vector(0,0,1). Utilizând dir_normal = Vector(0,0,1) va crea un plan pe axa z, în timp ce dir_normal = Vector(1,0,0) va crea planul pe axa x:

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

BoundBox este un cuboid care înconjoară planul cu o diagonală începând de la (3.0.0) și se termină la (5.0.2). Aici grosimea BoundBox în axa y este zero, deoarece forma noastră este complet plană.

Notă: makePlane acceptă doar Base.Vector() pentru start_pnt and dir_normal dar nu și tuplele

Crearea unei elipse

Pentru a crea o elipsă sunt mai multe căi:

Part.Ellipse()

Crează o elipsă cu raza mare 2 și cu raza mică 1 cu centrul în (0,0,0)

Part.Ellipse(Ellipse)

Creațo p copie a elipsei date

Part.Ellipse(S1,S2,Center)

Creează o elipsă centrat pe punctul central, unde planul elipsa este definită de Centrul, S1 și S2, axa sa principală este definită de Centru și S1, semiaxa sa majoră este distanța dintre centrul și S1, iar semiaxa sa minoră este distanța dintre S2 și axa principală.

Part.Ellipse(Center,MajorRadius,MinorRadius)

Creează o elipsă cu semiaxa majoră și cu o semiaxă minoră MajorRadius and MinorRadius, și localizată în planul definit de către Center și normala (0,0,1)

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

În codul de mai sus am trecut S1, S2 și centrul. În mod similar cu Arc, Ellipse creează, de asemenea, un obiect de elipsă, dar nu margine, așa că trebuie să convertiți-l în margine folosind toShape () pentru afișare.

Notă: Doar Arc aceptă Base.Vector() pentru puncte dar nu pentru tuple

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

pentru constructorul Ellipse de mai sus am trecut centrul, MajorRadius and MinorRadius

Crearea unui Tor

Folosind metoda makeTorus(radius1,radius2,[pnt,dir,angle1,angle2,angle]). Implicit avem pnt=Vector(0,0,0),dir=Vector(0,0,1),angle1=0,angle2=360 and angle=360. Considerați un tor ca pe un mic cerca care baliază de-a lungul unu cerc mare. Radius1 este raza cercului mare , iar radius2 este raza cercului mic, pnt este centrul torului și dir este direcția normalei. angle1 and angle2 sunt unghiurile în radiani pentru cercul mic, ultimul parametru -unghiul este pentru a face o secțiune în tor:

torus = Part.makeTorus(10, 2)

Codul de deasupra va crea un tor cu diametrul 20(raza 10) și grosimea 4 (raza cercului mic 2)

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

codul de mai sus va crea o felie de tor

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

Codul de mai sus va crea un semtor, numai ultimul parametru este schimbat adică unghiul și unghiurile rămase sunt implicite. Dând unghiul 180 va a crea tor de la 0 la 180, adică un jumătate de tor.

Crearea unui paralelipiped sau cuboid

Utilizând makeBox(length,width,height,[pnt,dir]). Implicit pnt=Vector(0,0,0) and dir=Vector(0,0,1)

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

Crearea unei sfere

Utilizând makeSphere(radius,[pnt, dir, angle1,angle2,angle3]). Implicit avem pnt=Vector(0,0,0), dir=Vector(0,0,1), angle1=-90, angle2=90 and angle3=360. angle1 și angle2 sunt verticala minimă și verticala maximă ale sferei, angle3 diametrul sferei.

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

Crearea unui cilindru

Utilizând makeCylinder(radius,height,[pnt,dir,angle]). Implicat avem pnt=Vector(0,0,0),dir=Vector(0,0,1) și angle=360

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

Crearea unui Con

Utilizând makeCone(radius1,radius2,height,[pnt,dir,angle]). Implicit avem pnt=Vector(0,0,0), dir=Vector(0,0,1) and angle=360

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

Modificarea Formelor geometrice

Sunt mai multe moduri de a modifica forme. Unele sunt operații simple de transformare cum ar fi mișcările sau formele rotative, altele sunt mai complexe, cum ar fi unirea și scăderea unei forme de alta. Țineți cont de asta

Operații de Transformare

Translatarea unei forme

Translatarea estr de fapt actul de mutarea a unei forme dintr-un loc în altul. Orice formă (muchie, fațetă, cube, etc...) poate fi translată în același mod:

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

Aceasta va muta forma noastră "myShape" 2 unități in direcția x .

Rotația unei forme

Pentru a roti o formă, aveți nevoie de uncentru de rotație, axa, și unghiul de rotație:

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

Codul de mai sus va roti forma cu 180 degrees în jurul axei Z .

Transformările generice cu matrici

O matrice este o modalitate foarte convenabilă de a stoca transformările în lumea reală 3D. Într-o singură matrice, puteți defini valorile de translația, rotirea și scalarea care trebuie aplicate unui obiect. De exemplu:

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

Notă: Matricile FreeCAD lucrează în radiani. De altfel, aproape toate operațiile de matrice care iau un vector pot lua de asemenea 3 numere, astfel încât cele două linii fac același lucru:

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

Atunci când matricea noastră este definită, o putem aplica formei noastre. FreeCAD oferă 2 metode pentru a face acest lucru: transformShape() and transformGeometry(). Diferența este că, cu prima, sunteți siguri că nu vor avea loc deformări (a se vedea "scalarea unei forme" de mai jos). Deci, putem aplica transformarea noastră astfel:

myShape.transformShape(myMat)

ori

myShape.transformGeometry(myMat)

Scalarea unei forme geometrice

Scalarea unei forme este o operațiune mai periculoasă deoarece, spre deosebire de translație sau rotație, scalarea neuniformă (cu valori diferite pentru x, y și z) poate modifica structura formei. De exemplu, scalarea unui cerc cu o valoare mai mare pe orizontală decât pe verticală îl va transforma într-o elipsă, care se comportă matematic foarte diferit. Pentru scalare, noi nu putem folosi transformShape, trebuie să folosimtransformGeometry():

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

Operații Booleene

Subtraction

Scăderea unei forme de la alta se numește "tăiat" în jargonul OCC/FreeCAD și se face astfel:

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

Intersection

În același mod, intersecția dintre două forme este denumită "comună" și se face pe aici:

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

Union

Unionea este numită "fuse" și lucrează în același mod:

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

Section

O secțiune este intersecția dintre o formă solidă și o formă plană. Va returna o curbă de intersecție, un compus cu margini

cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0))
cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.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>]

Extrusion

Extrudarea este actul de "împingere" a unei forme plate într-o anumită direcție care are ca rezultat un corp solid. Gândiți-vă la un cerc devenind un tub prin "împingerea lui":

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

Dacă cercul dvs. este gol, veți obține un tub gol. Dacă cercul dvs. este de fapt un disc, cu o față plină, veți obține un cilindru solid:

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

Explorarea formelor

Puteți explora ușor structura datelor topologice:

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

Dacă tastați liniile de mai sus în interpretul python, veți câștiga o bună înțelegere a structurii obiectelor Part. Aici, comanda makeBox () a creat o formă solidă. Acest solid, ca toate componentele solide, conține fațete. Fețele conțin întotdeauna polilinii, care sunt liste de margini care delimitează fața. Fiecare față are cel puțin o polilinie închisă (poate avea mai multe dacă fața are una sau mai multe găuri). În polilinie, putem privi la fiecare margine separat, iar în interiorul fiecărei margini, putem vedea vârfurile. Liniile drepte au doar două vârfuri, evident.

Analiza muchiei

În cazul unei muchii, care este o curbă arbitrară, este cel mai probabil să doriți a face o discretizare. În FreeCAD marginile sunt parametrizate după lungimile lor. Asta înseamnă ca puteți parcurge o margine/curba pe lungimea ei:

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

Now you can access a lot of properties of the edge by using the length as a position. That means if the edge is 100mm long the start position is 0 and the end position 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)

Utilizarea selecție

Aici vedem acum modul în care putem folosi selecția utilizată de utilizator în vizualizator. Mai întâi de toate, creăm o casetă și o afișează în vizualizator

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

Selectați acum unele fețe sau margini. Cu acest script puteți itera toate obiectele selectate și sub-elementele acestora:

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

Selectați unele margini și acest progrămel script va calcula lungimea:

length = 0.0
for o in Gui.Selection.getSelectionEx():
	for s in o.SubObjects:
		length += s.Length
print "Length of the selected edges:" ,length

Exemplul complet : Sticla OCC (Open CASCADE Technology)

Un exemplu tipic găsiți în OpenCasCade Technology Tutorial Este cum se construiește o sticlă. Acesta este un exercițiu bun și pentru FreeCAD. De fapt, puteți urma exemplul nostru de mai jos și pagina OCC simultan, veți înțelege cum sunt implementate structurile OCC în FreeCAD. Scenariul complet de mai jos este, de asemenea, inclus în instalarea FreeCAD (în interiorul folderului Mod/Part) și poate fi apelat de la interpretul python prin tastarea:

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

Programul script complet

aici este programul script complet MakeBottle:

import Part, FreeCAD, math
from FreeCAD import Base

def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
   aPnt1=Base.Vector(-myWidth/2.,0,0)
   aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
   aPnt3=Base.Vector(0,-myThickness/2.,0)
   aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
   aPnt5=Base.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=Base.Matrix()
   aTrsf.rotateZ(math.pi) # rotate around the z-axis
   
   aMirroredWire=aWire.transformGeometry(aTrsf)
   myWireProfile=Part.Wire([aWire,aMirroredWire])
   myFaceProfile=Part.Face(myWireProfile)
   aPrismVec=Base.Vector(0,0,myHeight)
   myBody=myFaceProfile.extrude(aPrismVec)
   myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
   neckLocation=Base.Vector(0,0,myHeight)
   neckNormal=Base.Vector(0,0,1)
   myNeckRadius = myThickness / 4.
   myNeckHeight = myHeight / 10
   myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)	
   myBody = myBody.fuse(myNeck)
   
   faceToRemove = 0
   zMax = -1.0
   
   for xp in myBody.Faces:
       try:
           surf = xp.Surface
           if type(surf) == Part.Plane:
               z = surf.Position.z
               if z > zMax:
                   zMax = z
                   faceToRemove = xp
       except:
           continue
   
   myBody = myBody.makeFillet(myThickness/12.0,myBody.Edges)
   
   return myBody

el = makeBottle()
Part.show(el)

Explicații detaliate

import Part, FreeCAD, math
from FreeCAD import Base

Vom avea, desigur, modulul Part, dar și modulul FreeCAD.Base, care conține structuri de bază FreeCAD precum vectori și matrice.

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

Aici definim funcția makeBottle. Această funcție poate fi apelată fără argumente, așa cum am făcut mai sus, caz în care valorile implicite pentru lățime, înălțime, și grosime vor fi utilizate. Apoi, definim câteva puncte care vor fi utilizate pentru construirea profilului de bază.

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

Aici definim geometria: un arc, format din 3 puncte și două segmente de linie, formate din câte 2 puncte.

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

Vă amintiți diferența dintre geometrie și forme? Aici construim forme geometrice ale construcției noastre. 3 margini (marginile pot fi drepte sau curbate), apoi o poliline realizează acele trei margini.

aTrsf=Base.Matrix()
   aTrsf.rotateZ(math.pi) # rotate around the z-axis
   aMirroredWire=aWire.transformGeometry(aTrsf)
   myWireProfile=Part.Wire([aWire,aMirroredWire])

Până acum am construit doar o jumătate de profil. Mai ușor decât construirea întregului profil în același mod, putem doar să simetrizăm ceea ce am făcut și să lipim ambele jumătăți împreună. Așadar, vom crea mai întâi o matrice. O matrice este o modalitate foarte comună de a aplica transformări la obiecte din lumea 3D, deoarece poate conține într-o singură structură toate transformările de bază pe care obiectele 3D le pot suferi (mișcare, rotire și scalare). Aici, după ce creăm matricea, o oglindim și creăm o copie a poliliniei noastre cu matricea de transformare aplicată. Acum avem două polilinii și putem face o a treia polilinie din ele, deoarece poliliniile sun nt de fapt liste de margini.

myFaceProfile=Part.Face(myWireProfile)
   aPrismVec=Base.Vector(0,0,myHeight)
   myBody=myFaceProfile.extrude(aPrismVec)
   myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)

Acum că avem o polilinie închisă, aceasta poate fi transformat într-o fațetă. Odată ce avem o fațetă, o putem extruda. În acest fel, am făcut de fapt un solid. Apoi aplicăm o mică și frumoasă (pilire) rotunjire la obiectul nostru pentru că ne pasă de un design bun, nu-i așa?

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

Apoi, corpul sticlei noastre este făcută, mai avem nevoie să creăm un gât. Deci noi face un nou solid, cu un cilindru.

myBody = myBody.fuse(myNeck)

Funcționarea siguranței, care în alte aplicații este uneori numită uniune, este foarte puternică. Va avea grijă de lipirea a ceea ce trebuie lipit și de a elimina părțile care trebuie să fie eliminate.

return myBody

Apoi, ne întoarcem Piesa noastră solidă ca rezultat al funcției noastre.

el = makeBottle()
Part.show(el)

În final, numim funcția definită și facem piesa vizibilă.

Paralelipiped găurit

Aici este un exemplul de construcție a unui paralelipiped găurit.

Construcția este realizată dintr-un capăt în altul iar când paralelipipedul este terminat, acesta este găurit cu un cilindru.

import Draft, Part, FreeCAD, math, PartGui, FreeCADGui, PyQt4
from math import sqrt, pi, sin, cos, asin
from FreeCAD import Base

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 = FreeCAD.Matrix()
myMat.rotateZ(math.pi/2)
face2.transformShape(myMat)
face2.translate(FreeCAD.Vector(size, 0, 0))

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

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

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

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

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

mySolid = Part.makeSolid(myShell)
mySolidRev = mySolid.copy()
mySolidRev.reverse()

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

cut_part = mySolidRev.cut(myCyl)

Part.show(cut_part)

Încărcare și salvare

Există mai multe moduri de a vă salva munca în modulul Part. Puteți bineînțeles salvați documentul FreeCAD, dar puteți salva și un obiect piesă/Part direct la formatele CAD obișnuite, cum ar fi BREP, IGS, STEP și STL.

Salvarea unei forme într-un fișier este ușoară. Există metode disponibile exportBrep(), exportIges(), exportStl() și exportStep() pentru toate obiectele de formă. Deci, faci:

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

acest lucru va salva caseta noastră într-un fișier STEP. Pentru a încărca un BREP, IGES sau STEP, pur și simplu faceți contrariul:

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

Pentru a converti un fișier .stp în .igs este simplu :

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

Rețineți că importul sau deschiderea fișierelor BREP, IGES sau STEP poate fi de asemenea făcute direct din File -> Open or File -> Import menu, iar la export este File -> Export



Conversia obiectelor Piese în Plasă

Conversia obiectelor de nivel superior, cum ar fi Part shell în obiecte mai simple, cum ar fi meshes este o operație simplă, în care toate fațetele unui obiect Piesă i se aplică o discretizarea în triunghiur. Rezultatul acestei discretizări(tessellation) este apoi folosit pentru a construi o plasă: (să presupunem că documentul nostru conține un obiect de piesă)

#let's assume our document contains one part object
import Mesh
faces = []
shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.tessellate(1) # the number represents the precision of the tessellation)
for tri in triangles[1]:
    face = []
    for i in range(3):
        vindex = tri[i]
        face.append(triangles[0][vindex])
    faces.append(face)
m = Mesh.Mesh(faces)
Mesh.show(m)

Uneori, discretizarea -transformarea în ochiuri de plată triunghiulare- a anumitor anumitor fețe oferite de OpenCascade este destul de urâtă. Dacă fața are un spațiu de parametru dreptunghiular și nu conține găuri sau alte curbe de tăiere, puteți crea și o plasă pe cont propriu:

import Mesh
def makeMeshFromFace(u,v,face):
	(a,b,c,d)=face.ParameterRange
	pts=[]
	for j in range(v):
		for i in range(u):
			s=1.0/(u-1)*(i*b+(u-1-i)*a)
			t=1.0/(v-1)*(j*d+(v-1-j)*c)
			pts.append(face.valueAt(s,t))

	mesh=Mesh.Mesh()
	for j in range(v-1):
		for i in range(u-1):
			mesh.addFacet(pts[u*j+i],pts[u*j+i+1],pts[u*(j+1)+i])
			mesh.addFacet(pts[u*(j+1)+i],pts[u*j+i+1],pts[u*(j+1)+i+1])

	return mesh

Convertirea Plaselor în obiecte Part

Convertirea ochiurilor de plasă în obiecte piese este o operație extrem de importantă în lucrul cu CAD, pentru că de multe ori primiți date 3D în format de ochiuri de plasă de la alte persoane sau ieșite din alte aplicații. Meshurile sunt foarte practice pentru a reprezenta geometria liberă și pentru scenele vizuale mari, deoarece este foarte ușoară, dar pentru CAD, în general, preferăm obiecte de nivel mai înalt care transportă mult mai multe informații, cum ar fi ideea de solid sau fațetele făcute din curbe în loc de triunghiuri.

Convertirea ochiurilor de plasă în obiecte de nivel superior (manipulate de Part Module în FreeCAD) nu este o operație ușoară. Mesh-urile pot fi realizate din mii de triunghiuri (de exemplu, atunci când sunt generate de un scanner 3D) și având solide realizate din același număr de fețe ar fi extrem de greu de manipulat. Deci, în general, doriți să optimizați obiectul când faceți conversia.

FreeCAD oferă în prezent două metode pentru a transforma Plasele în obiecte piese (Part). Prima metodă este o conversie simplă, directă, fără optimizare:

import Mesh,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)

Cea de-a doua metodă oferă posibilitatea de a considera aspectul ochiurilor de plasă coplanare atunci când unghiul dintre ele este sub o anumită valoare. Acest lucru permite construirea unor forme mai simple: (să presupunem că documentul nostru conține un obiect Mesh)

# let's assume our document contains one Mesh object
import Mesh,Part,MeshPart
faces = []
mesh = App.ActiveDocument.ActiveObject.Mesh
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here
 
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))

shell=Part.Compound(faces)
Part.show(shell)
#solid = Part.Solid(Part.Shell(faces))
#Part.show(solid)
Arrow-left.svg Previous: Mesh to Part
Next: Pivy Arrow-right.svg

Geometria care apare în vizualizările 3D ale FreeCAD este redată de biblioteca Coin3D. Coin3D este o implementare satandard a OpenInventor.Software-ul openCascade oferă, de asemenea, aceeași funcționalitate, dar s-a hotărât, încă de la începuturile FreeCAD, să nu se folosească de vizualizatorul openCascade încorporat ci mai degrabă să se treacă la software-ul coin3D mai performant. O modalitate bună de a învăța despre această bibliotecă este cartea Open Inventor Mentor.

OpenInventor este de fapt un limbaj de descriere a scenei 3D. Scena descrisă în openInventor este apoi redată în OpenGL pe ecran. Coin3D are grijă să facă acest lucru, astfel încât programatorul nu are nevoie să se ocupe de apelurile complexe openGL, ci doar să-l furnizeze cu un cod OpenInventor valabil. Marele avantaj este că OpenInventor este un standard foarte bine cunoscut și bine documentat.

Una din marile servicii pe care FreeCAD le face pentru dvs. este de a traduce în mod deschis informația geometriei OpenCascade în limbajul openInventor.

OpenInventor descrie o scenă 3D sub formă de ascenegraph, like the one below:

Scenegraph.gif image from Inventor mentor

Un scenograf openInventor descrie tot ce face parte dintr-o scenă 3D, cum ar fi geometria, culorile, materialele, luminile etc., și organizează toate datele într-o structură convenabilă și clară. Totul poate fi grupat în sub-structuri, permițându-vă să vă organizați conținutul scenei cât de mult vă place. Iată un exemplu de fișier openInventor:

#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 {
       }
    }
}

După cum puteți vedea, structura este foarte simplă. Utilizați separatoare pentru a vă organiza datele în blocuri, un pic asemănător cu modul cum ați organiza fișierele în foldere. Fiecare afirmație afectează ce urmează, de exemplu primele două elemente ale separatorului rădăcină sunt o rotație și o translație, ambele afectează următorul element, care este un separator. În acest separator se definește un material și o altă transformare. Cilindrul nostru va fi astfel afectat de ambele transformări, cel care a fost aplicat direct la acesta și cel aplicat separatorului părinte.

De asemenea, avem multe alte tipuri de elemente pentru organizarea scenei noastre, cum ar fi grupuri, switch-uri sau adnotări. Putem defini materiale foarte complexe pentru obiectele noastre, cu culori, texturi, moduri de umbrire și transparență. De asemenea, putem defini lumini, camere de luat vederi și chiar mișcări. Este posibil chiar să încorporați fragmente de script-uri în fișierele openInventor, pentru a defini comportamente mai complexe.

Dacă sunteți interesat să aflați mai multe despre openInventor, mergeți direct la cele mai faimoase referințe ale sale Inventor mentor.

În FreeCAD, în mod normal, nu trebuie să interacționăm direct cu scenograful openInventor. Fiecare obiect dintr-un document FreeCAD, fiind o plasă, o formă a unei piese sau orice altceva, devine automat convertit în codul openInventor și inserat în descrierea grafică a scenei principală pe care îl vedeți într-o vizualizare 3D. Această descriere grafică este actualizat continuu când faceți modificări, adăugați sau eliminați obiecte în document. De fapt, fiecare obiect (în spațiul App) are un furnizor de vizualizare (un obiect corespunzător în spațiul Gui), responsabil pentru emiterea codului openInventor.

Dar există multe avantaje pentru a putea accesa scenegraful direct. De exemplu, putem schimba temporar aspectul unui obiect sau putem adăuga obiecte în scenă care nu au o existență reală în documentul FreeCAD, cum ar fi geometria construcției, ajutoarele, sugestii grafice sau unelte cum ar fi manipulatorii sau informații pe ecran .

FreeCAD dispune de mai multe instrumente pentru a vedea sau a modifica codul openInventor. De exemplu, următorul cod python va afișa reprezentarea openInventor a unui obiect selectat:

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

Dar avem, de asemenea, un modul python care permite accesul complet la tot ceea ce gestionează Coin3D, cum ar fi descrierea grafică a scenei FreeCAD. Deci, citiți mai departe Pivy.


Pivy este o bibliotecă de coduri care servește drept punte între Python și coin Coin3d, biblioteca de randare 3D utilizată de către FreeCAD. Atunci când este importat într-un interpretor python care rulează, Pivy permite dialogul direct și imediat cu orice procedură Coin3d care rulează scenegraphs, ca dexemplu vizualizările FreeCAD 3D , sau chiar creare unora noi. Pivy este inclus în pachetul standard de instalare FreeCAD .

Biblioteca coin este împărțită în mai multe piese, coin însuși, este pentru manipularea scripturilor și legăturilor pentru mai multe sisteme GUI, cum ar fi ferestrele sau, ca în cazul nostru, qt. Modulele respective sunt disponibile și pentru piv, în funcție de situația în care sunt prezente în sistem. Modulul coin este întotdeauna prezent și este ceea ce vom folosi oricum, deoarece nu va trebui să ne pese de ancorarea afișajului nostru 3D în orice interfață, deoarece este deja făcută de cpătre FreeCAD. Tot ce trebuie să facem este:

from pivy import coin

Accesarea și modificarea unui scene grafice 3D

Am văzut în pagina Scenegraph cum Coin organizează o scenă tipică. Tot ce este afișat 3D în FreeCAD este construit și festionat de către Coin. Avem o rădăcină, iar toate obiectele de pe ecran sunt copiii lui.legat prin noduri

Free cad are un mod facil de a accede la radacina unei scene 3D:

sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
print sg

Radăcina scenei va fi :

<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >

Putrem inspecta imediat copii scenei noastre:

for node in sg.getChildren():
    print node

Unele dintre aceste noduri, cum ar fi SoSeparators sau SoGroups, pot avea proprii copii. Lista completă a obiectelor disponibile pentru programul Coin poate fi găsită în official coin documentation.

Acum să încercăm să adăugăm ceva la scenă (proiect). Vom adăuga un frumos cub roșu:

col = coin.SoBaseColor()
col.rgb=(1,0,0)
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

și aici este (frumosul ) nostru cub roșu. Acum. hai să încerca aceasta:

col.rgb=(1,1,0)

Ai văzut? Totul este încă accesibil și editabil din voleu. Nu este nevoie să recalculați sau să reproiectați nimic, Coin are grijă de tot. Puteți adăuga ceea ce doriți la scenă (proiectul), schimbați proprietățile, ascundeți obiecte, expuneți temporar obiecte, faceți ceva. Desigur, acest lucru afectează numai afișarea vizualizării 3D. Afișarea documentului deschis este recalculată de FreeCAD și recalculează un obiect atunci când trebuie să fie. Deci, dacă modificați aspectul unui obiect existent în FreeCAD, aceste modificări se vor pierde dacă obiectul este recalculat sau când redeschideți fișierul.

Un lucru, pentru a lucra cu scripturile în scenariile tale, poți, când este necesar, să accesezi câteva proprietăți ale nodurilor pe care le-ai adăugat. De exemplu, dacă vrem să mutăm cubul, am fi adăugat un nod SoTranslation la nodul nostru personalizat și,el ar fi arătat astfel:

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)

Rețineți că într-un scenariu openInventor, ordinea este importantă. Un nod afectează ceea ce urmează, astfel încât să puteți spune ceva de genul: culoarea roșie, cubul, culoarea galbenă, sfera și veți obține un cub roșu și o sferă galbenă. Dacă am adăugat traducerea la nodul nostru personalizat existent, acesta va veni după cub și nu îl va afecta. Dacă am fi introdus-o

trans.translation.setValue([2,0,0])

Și cubul nostru ar sări 2 unități la dreapta. În cele din urmă, eliminarea a ceva se face cu:

sg.removeChild(myCustomNode)

Utilizarea mecanismului de trecere în argument a unei alte funcții

La callback mechanism, Un mecanism de Callback este sistem care permite unei bilbioteci pe caer o utilizați , ca de ex bilbioteca Coin de a trece în argumente a unei alte funcții pentru l'Objet Python în curs de execuție. Acest lucru este extrem de util, deoarece în acest mod coin vă poate avertiza dacă un anumit eveniment apare în scenă. Coin poate vedea lucruri foarte diferite, cum ar fi poziția mouse-ului, clicurile pe un buton al mouse-ului, tastele de tastatură care sunt apăsate și multe alte lucruri.

FreeCAD are o modalitate ușoară de a utiliza aceste callbacks:

class ButtonTest:
  def __init__(self):
    self.view = FreeCADGui.ActiveDocument.ActiveView
    self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getMouseClick) 
  def getMouseClick(self,event_cb):
    event = event_cb.getEvent()
    if event.getState() == SoMouseButtonEvent.DOWN:
      print "Alert!!! A mouse button has been improperly clicked!!!"
      self.view.removeEventCallbackSWIG(SoMouseButtonEvent.getClassTypeId(),self.callback) 
 
ButtonTest()

Callback-ul a fost pornit de la un obiect, deoarece obiectul trebuie să ruleze în continuare când apare apelul invers. Vezi de asemenea complete list a posibilelor evenimente și parametrii lor, sau în official coin documentation.

Documentație

Din păcate, pivy nu dispune încă de o documentație potrivită, dar deoarece există o traducere exactă a lui coin, puteți utilizat în toată securitatea documetația de referință a lui coin, și utilizați stilul Python în locul stilului c ++ ( par exemple SoFile::getClassTypeId() en c++, serait SoFile.getClassId() en pivy ) c++ style (for example SoFile::getClassTypeId() would in pivy be SoFile.getClassId())

In C++:

SoFile::getClassTypeId()

In Pivy

SoFile.getClassId()


PySide

PySide este un instrument Python multiplatformă obligatoriu pentru a crea GUI în QT. FreeCAD utilizează PySide pentru toate GUI (Graphic User Interface) în interiorul Python. PySide este o alternativă la pachetul PyQt folosit anterior de FreeCAD pentru GUI. PySide are o licență mai permisivă. A se vedea Differences Between PySide and PyQt for more information on the differences.

Utilizatorii de FreeCAD ating adesea limitele interfeței integrate. Dar pentru utilizatorii care doresc să personalizeze operațiile lor Interfața Python există și este documentată în Tutorialul de script Python. Interfața pentru FreeCAD dă o mare flexibilitatea și crește puterea FreeCAD. Pentru această interacțiune, utilizatorul de Python și Freecad , noi utilizăm PySide care este documetnat în această pagină.

Python oferă instrucțiunea "print" care dă codul:

print 'Hello World'

Cu instrucțiune print din Python aveți un control limatat asupra aparenței și a compartamentului/ PySide furnizează controlul lipsă și administrează mediul (ca de exemplu mediul macrocomenzilor FreeCAD) acolo undew instalările integrare ale Python nu sunt suficiente

Abilitățile PySide variază de la:

PySideScreenSnapshot1.jpg

până la:

PySideScreenSnapshot2.jpg

Acestea împart subiectul în 3 părți, diferențiate după nivelul de cunoaștere a PySide, Python și FreeCAD. Prima pagină are o imagine de ansamblu și un material de referință care oferă o descriere a PySide și modul în care sunt setate împreună, în timp ce a doua și a treia pagină sunt în mare parte exemple de cod la diferite niveluri.

Intenția este ca paginile asociate să furnizeze un cod Python simplu pentru a rula PySide, astfel încât utilizatorul care lucrează la o problemă să poată copia cu ușurință codul, să-l lipsească în munca proprie, să-l adapteze după cum este necesar și să se întoarcă la rezolvarea problemelor cu FreeCAD. Sperăm că nu trebuie să meargă pe Internet în căutarea răspunsurilor la problemele PySide. În același timp, această pagină nu are intenția de a înlocui diferitele tutoriale și site-uri de referință PySide disponibile pe web.


Pe lângă tipurile obișnuite de obiecte, cum ar fi adnotările, plasele și obiectele de piese, FreeCAD oferă, de asemenea, uimitoare posibilitate de a scrie scriptul obeictelor 100% Python, numite caracteristici Python. Aceste obiecte se vor comporta exact ca orice alt obiect FreeCAD și vor fi salvate și restaurate automat la salvarea / încărcarea fișierelor.

O particularitate care trebuie înțeleasă, aceste obiecte sunt salvate în fișiere FreeCAD FcStd cu modului python json module. Acest modul transformă un obiect python în șir de caractere(test), permițându-l să fie adăugat la fișierul salvat. Odată încărcat, modulul json utilizează șirul de caracter pentru a recrea obiectul original, cu condiția ca acesta să aibă acces la codul sursă care a creat obiectul. Aceasta înseamnă că dacă salvați un astfel de obiect personalizat și îl deschideți pe o mașină unde codul python care a generat obiectul nu este prezent, obiectul nu va fi recreat. Dacă distribuiți astfel de obiecte ale altora, va trebui să distribuiți în totalitate scriptul python care a creat-o împreună.

Caracteristicile Python respectă aceeași regulă ca toate funcțiile FreeCAD: ele sunt separate în părți App(application) și GUI(interfață grafică). Partea de aplicație, Object App, definește geometria obiectului nostru, în timp ce partea GUI, definește modul în care obiectul va fi afișat pe ecran. Instrumentul View Provider Objet, ca oricare altă caracteristică FreeCAD, este disponibil numai când rulați FreeCAD în propriul GUI. Există mai multe proprietăți și metode disponibile pentru a construi obiectul. Proprietățile trebuie să fie oricare dintre tipurile de proprietăți predefinite oferite de FreeCAD și vor apărea în fereastra de vizualizare a proprietății, astfel încât acestea să poată fi editate de utilizator. În acest fel, obiectele FeaturePython (au toate proprietățile Python) sunt cu adevărat și în totalitate parametrice. Puteți defini proprietăți pentru Obiect și ViewObject separat.

Truc: În versiunile anterioare am folosit modulul Python cPickle. Cu toate acestea, acest modul execută un cod arbitrar și provoacă astfel o problemă de securitate. Astfel, am optat pentru modulul json al Python.

Exemplu de bază

Următorul exemplu poate fi găsit in fișierul src/Mod/TemplatePyMod/FeaturePython.py, împreună cu alte exemple:

'''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 __getstate__(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 __setstate__(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()

Proprietăți disponibile

Proprietățile sunt adevăratele pietre de temelie ale obiectelor FeaturePython. Prin intermediul acestora, utilizatorul va putea să interacționeze și să vă modifice obiectul. După crearea unui nou obiect FeaturePython din documentul dvs. (obj = FreeCAD.ActiveDocument.addObject ("App :: FeaturePython", "Box")), puteți obține o listă a proprietăților disponibile prin emiterea:

obj.supportedProperties()

Veți obține o listă cu proprietățile disponibile:

App::PropertyBool
App::PropertyBoolList
App::PropertyFloat
App::PropertyFloatList
App::PropertyFloatConstraint
App::PropertyQuantity
App::PropertyQuantityConstraint
App::PropertyAngle
App::PropertyDistance
App::PropertyLength
App::PropertySpeed
App::PropertyAcceleration
App::PropertyForce
App::PropertyPressure
App::PropertyInteger
App::PropertyIntegerConstraint
App::PropertyPercent
App::PropertyEnumeration
App::PropertyIntegerList
App::PropertyIntegerSet
App::PropertyMap
App::PropertyString
App::PropertyUUID
App::PropertyFont
App::PropertyStringList
App::PropertyLink
App::PropertyLinkSub
App::PropertyLinkList
App::PropertyLinkSubList
App::PropertyMatrix
App::PropertyVector
App::PropertyVectorList
App::PropertyPlacement
App::PropertyPlacementLink
App::PropertyPlacementList
App::PropertyColor
App::PropertyColorList
App::PropertyMaterial
App::PropertyPath
App::PropertyFile
App::PropertyFileIncluded
App::PropertyPythonObject
Part::PropertyPartShape
Part::PropertyGeometryList
Part::PropertyShapeHistory
Part::PropertyFilletEdges
Sketcher::PropertyConstraintList

Când adăugați proprietăți obiectelor dvs. personalizate, aveți grijă de acestea:

  • Nu utilizați caractere "<" sau ">" în descrierile de proprietăți (care ar sparge fragmente de cod în fișierul xml.fcstd)
  • Proprietățile sunt stocate în ordine alfabetică într-un fișier .fcstd. Toate proprietățile ale căror nume vine după ”Shape” sunt așezate în ordine alfabetică . Dacă aveți o formă în proprietățile dvs., și cum orice proprietate al cărei nume vine după "Shape", se poate să aveți parte de comportamente ciudate.

A complete list of property attributes can be seen in the PropertyStandard C++ header file. For instance, if you want to allow the user to enter only a limited range of values (e.g. using PropertyIntegerConstraint), in Python you will assign a tuple containing not only the property value, but also the lower and upper limit as well as the stepsize, as below:

prop = (value, lower, upper, stepsize)

Tipuri de proprietăți

Implicit proprietățile pot fi actualizate. Este posibil să se facă proprietățile numai pentru citire, de exemplu în cazul în care cineva dorește să afișeze rezultatul unei metode. De asemenea, este posibilă ascunderea proprietății. Tipul de proprietate poate fi setat utilizând

obj.setEditorMode("MyPropertyName", mode)

unde mode este un int scurt care poate fi definit ca:

 0 -- modul imolicit, read and write
 1 -- read-only
 2 -- hidden

EditorModes nu sunt definite la reîncărcarea fișierului FreeCAD. Acest lucru ar putea fi făcut prin funcția the __setstate__ function. Vezi http://forum.freecadweb.org/viewtopic.php?f=18&t=13460&start=10#p108072. Folosind setEditorMode proprietățile sunt citite numai în PropertyEditor. S-ar putea schimba încă de la Python. Pentru a le face să citească doar setarea trebuie să fie transmisă direct în interiorul funcției addProperty. A s vedea http://forum.freecadweb.org/viewtopic.php?f=18&t=13460&start=20#p109709 for an example.

Using the direct setting in the addProperty function, you also have more possibilities. In particular, an interesting one is mark a property as an output property. This way FreeCAD won't mark the feature as touched when changing it (so no need to recompute).

Example of output property (see also https://forum.freecadweb.org/viewtopic.php?t=24928):

obj.addProperty("App::PropertyString","MyCustomProperty","","",8)

The property types that can be set at last parameter of the addProperty function are:

 0 -- Prop_None, No special property type
 1 -- Prop_ReadOnly, Property is read-only in the editor
 2 -- Prop_Transient, Property won't be saved to file
 4 -- Prop_Hidden, Property won't appear in the editor
 8 -- Prop_Output, Modified property doesn't touch its parent container
 16 -- Prop_NoRecompute, Modified property doesn't touch its container for recompute


You can find these different property types defined in the source code C++ header for PropertyContainer

Alte exemple mai complexe

Acest exemplu ne face să utilizăm Part Module pentru a crea un octahedron, apoi crează reprezentarea sa coin cu pivy.

Primul este însuși obiectul Document:

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

Apoi, avem obiectul furnizorului de vizualizare, responsabil pentru afișarea obiectului în 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.SoIndexedLineSet()

     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 __getstate__(self):
     return None

  def __setstate__(self,state):
     return None

În cele din urmă, odată ce obiectul și obiectul său de vedere sunt definite, trebuie doar să le numim (clasa Octahedron și codul clasei viewprovider pot fi copiate direct în consola Python FreeCAD):

FreeCAD.newDocument()
a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Octahedron")
Octahedron(a)
ViewProviderOctahedron(a.ViewObject)

Crearea de obiecte selectabile

Dacă doriți să faceți obiectul selectabil sau cel puțin o parte a acestuia, făcând clic pe el în fereastra de vizualizare, trebuie să includeți forma geometriei sale în interiorul unui nod SoFCSelection. Dacă obiectul are o reprezentare complexă, cu widget-uri, adnotări etc., poate doriți să includeți doar o parte a acestuia într-o selecție SoFCSelecție. Tot ceea ce este un SoFCSelection este scanat constant de FreeCAD pentru a detecta selectia / preselectarea, deci ar fi bine să nu incercați a o supraincarca cu scanări inutile. Iată un exemplu de ceea ce ați face pentru a include o self.face din exemplul de mai sus :

selectionNode = coin.SoType.fromName("SoFCSelection").createInstance()
selectionNode.documentName.setValue(FreeCAD.ActiveDocument.Name)
selectionNode.objectName.setValue(obj.Object.Name) # here obj is the ViewObject, we need its associated App Object
selectionNode.subElementName.setValue("Face")
selectNode.addChild(self.face)
...
self.shaded.addChild(selectionNode)
self.wireframe.addChild(selectionNode)

Pur și simplu, creați un nod SoFCSelection, apoi adăugați nodurile de geometrie la acesta, apoi îl adăugați la nodul principal, în loc să adăugați direct nodurile de geometrie.

Lucrul cu forme simple

Dacă obiectul dvs. parametric emite doar o formă simplă, nu este necesar să utilizați un obiect furnizor de vizualizare(view provider object). Forma va fi afișată utilizând reprezentarea standard a formelor din 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()

Același cod utilizând 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()

Informație suplimentară

Există câteva subiecte foarte interesante pe forum despre obiectele script:

- Python object attributes lost at load

- New FeaturePython is grey

- Eigenmode frequency always 0?

- how to implement python feature's setEdit properly?

În plus față de exemplele prezentate aici puteți să vă aruncați o privire în codul sursă FreeCAD src/Mod/TemplatePyMod/FeaturePython.py for more examples.



FreeCAD are capacitatea uimitoare de a fi importabil ca modul python în alte programe sau într-o consolă python autonomă, împreună cu toate modulele și componentele sale. Este posibil chiar să importați interfața grafică GUI-ul FreeCAD ca modul python - cu some restrictions, dar cu anumite restricții.

Utilizarea FreeCAD fără interfață grafică/GUI

O primă aplicație directă, ușoară și utilă pe care o puteți face este importul documentelor FreeCAD în programul dvs. În următorul exemplu, vom importa geometria pieselor unui document FreeCAD în blender. Iată scenariul complet. Sper că veți fi impresionat de simplitatea sa:

FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
sys.path.append(FREECADPATH)
 
def import_fcstd(filename):
   try:
       import FreeCAD
   except ValueError:
       Blender.Draw.PupMenu('Error%t

Prima parte importantă este să vă asigurați că Python va găsi biblioteca noastră FreeCAD. Odată ce o găsește, toate modulele FreeCAD, cum ar fi Part, pe care o vom folosi, vor fi disponibile automat. Așa că luăm pur și simplu variabila sys.path, care este unde Python caută module și adăugăm calea FreCAD.Lib. Această modificare este doar temporară și se va pierde atunci când închidem interpretorul nostru python. Un alt mod ar putea fi să faceți o legătură cu biblioteca dvs. FreeCAD într-una din căile de căutare python. Am păstrat calea într-o constantă (FREECADPATH) astfel încât un alt utilizator al scriptului îi va fi mai ușor să configureze propriul sistem

Odată ce suntem siguri că biblioteca este încărcată (secvența try/except), acum putem lucra cu FreeCAD, la fel ca și cum am fi în interiorul interpretului Python al FreeCAD. Deschidem documentul FreeCAD care ne este transmis prin funcția principală main() și facem o listă a obiectelor sale. Apoi, pe măsură ce alegem doar să ne pese de geometria piesei, verificăm dacă proprietatea Type a fiecărui obiect conține "Part", apoi o mozaicăm (tessellation).

Mozaicarea (Tessellation) produce o listă de vârfuri(vertex) și o listă de fasțete definite de indici de vârfuri. Acest lucru este perfect, deoarece este exact același mod în care programul Blender definește ochiurile de plasă. Deci, sarcina noastră este ridicol de simplă, adăugăm ambele conținuturi ale listelor la vârfurile și fețetele unei rețele de tip Blender. Când totul este realizat, noi redesenăm ecranul și gata ”c'est fini” !

Bineînțeles, ați văzut că acest script este foarte simplu (de fapt am făcut unul mai avansat aici here),ați putea dori să-l extindeți, de exemplu importarea obiectelor de tip plasă, sau importarea ”Part Geometry” care nu are fațete sau importul altor formate de fișiere pe care FreeCAD le poate citi. De asemenea, ați putea dori să exportați forme geometrice într-un document FreeCAD, care se poate face în același mod. S-ar putea să doriți, de asemenea, să construiți un dialog, astfel încât utilizatorul să poată alege ce să importe, etc.... Frumusețea tuturor acestor lucruri constă de fapt că l-ai lăsat pe FreeCAD să efectueze în totalitate, prezentându-și în același timp rezultatele în programul pe care l-ai ales .

Utilizarea FreeCAD cu interfață grafică(GUI)

De la versiunea 4.2 cu Qt are capacitatea de a încorpora plugin-urile dependente de Qt-GUI în aplicații gazdă non-Qt și de a partaja bucla evenimentului gazdei.

Mai presus de toate, pentru FreeCAD, aceasta înseamnă că poate fi importat dintr-o altă aplicație cu interfața sa completă de utilizator (GUI) și în consecință aplicația gazdă controlează pe deplin FreeCAD.

Tot codul python pentru a obține aceasta are numai 2 linii

import FreeCADGui 
FreeCADGui.showMainWindow()

Dacă aplicația se bazează pe Qt, atunci aceasta soluție ar trebui să funcționeze pe toate platformele suportate de către Qt . Cu toate acestea, gazda ar trebui să conecteze aceeași versiune QT ca și FreeCAD, deoarece altfel ați putea obține erori de execuție neașteptate.

Cu toate acestea, pentru aplicațiile non-Qt există câteva limitări pe care trebuie să le cunoașteți. Această soluție probabil nu funcționează împreună cu toate celelalte seturi de instrumente(toolkit). Pentru Windows funcționează atât timp cât aplicația gazdă este compatibilă și se bazează direct pe Win32 sau pe orice alt set de instrumente care utilizează intern API-ul Win32, cum ar fi wxWidgets, MFC sau WinForms. Pentru ca aceasta să funcționeze sub X11(Linux), aplicația gazdă trebuie să conecteze biblioteca "glib".

Notă, pentru orice aplicație consolă această soluție, această soluție, nu va funcționa deoarece nu este o funcționare în buclă de evenimente (event loop running) în acest sistem.

Avertismente

Deși este posibil să importați FreeCAD la un interpretor extern Python, acesta este un scenariu de utilizare obișnuit și necesită o atenție deosebită. În general, este mai bine să folosiți Python inclus în FreeCAD, via o linia de comandă sau ca pe un subproces. Vedeți Start up and Configuration pentru mai multe informații asupra ultimelor două opțiuni.

Deoarece modulul FreeCAD Python este compilat din C ++ (mai degrabă decât de a fi un modul Python pur), acesta poate fi importat numai de la un interpretorul Python compatibil. În general, acest lucru înseamnă că interpretorul Python trebuie să fie compilat cu același compilator C, cum a fost cel folosit pentru a construi FreeCAD. Informații despre compilatorul folosit pentru a construi un interpretor Python (inclusiv cel construit cu FreeCAD), pot fi găsite la:

>>> 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)]'


Base ExampleCommandModel.png Tutorial

Topic
Python
Level
Beginner
Time to complete
Author
FreeCAD version
Example File(s)



Această pagină conține exemple, extrase, fragmente de cod Python de la FreeCAD, colectate din experiențele utilizatorilor și discuțiile pe forumuri. Citește și folosește-o ca un început pentru scripturile tale ...

Un fișier tipic InitGui.py

Fiecare modul trebuie să conțină, pe lângă fișierul modulului principal, un fișier InitGui.py, responsabil pentru înserarea modulului GUI principal. Acesta este un exemplu simplu.

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())

Un fișier modul tipic

Acesta este un exemplu al unui fișier modul principal, care conține tot ceea ce face modul dvs. Acesta este fișierul Scripts.py invocat în exemplul anterior. Puteți să aveți toate comenzile personalizate aici.

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())

Importul unui nou tip de fișier

Efectuarea unui import pentru un nou tip de fișier în FreeCAD este ușoară. FreeCAD nu ia în considerare că importați orice date într-un document deschis, pentru că nu puteți deschide direct un nou tip de fișier. Deci, ceea ce trebuie să faceți este să adăugați noua extensie de fișiere în lista de extensii cunoscute a FreeCAD și să scrieți codul care va citi fișierul și va crea obiectele FreeCAD pe care le doriți:

Această linie trebuie adăugată în fișierul InitGui.py pentru a adăuga noua extensie de fișier în listă de extensii:

# 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")

Then in the Import_Ext.py file:

def open(filename): 
   doc=App.newDocument()
   # here you do all what is needed with filename, read, classify data, create corresponding FreeCAD objects
   doc.recompute()

Pentru a exporta documentul la unele tipuri de fișiere noi funcționează în același mod, cu excepția faptului că utilizați:

FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext") 

Adăugarea unei linii (segment)

O linie este definită doar de 2 puncte.

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()

Adăugarea unui poligon

Un poligon este pur și simplu un set de segmente de linie conectate (o polilinie în AutoCAD). Nu este obligatoriu să fie închisă.

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()

Adăugarea și îndepărtarea unui obiect într-un grup

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

Notă: Puteți chiar să adăugați un alt grup la un grup...

Adăugarea unei plase

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

Adăugarea unui cerc sau a unui arc de cerc

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()

Accesarea și schimbarea reprezentării unui obiect

Fiecare obiect dintr-un document FreeCAD are un obiect vederii asociat, care stochează toți parametrii care definesc proprietățile obiectului, cum ar fi culoarea, lățimea liniei etc.

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

Observarea evenimentelor mouse-ului în vizualizatorul 3D via Python

Cadrul Inventor permite adăugarea unuia sau mai multor noduri de apel invers(callback) la scena grafică vizualizată. În mod implicit, în FreeCAD, un nod de apel invers este instalat per vizualizator(fereastra de afișare grafică), ceea ce permite adăugarea funcțiilor globale sau statice C ++. Metode de legarea adecvată sunt furnizate de Python, pentru a permite utilizarea acestei tehnici plecând de la codul 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)

Acum, alegeți undeva în zona din ecran (suprafață de lucru)vizualizatorul 3D și observați mesajele din fereastra de ieșire. Pentru a termina observația, trebuie doar să sunați

v.removeEventCallback("SoMouseButtonEvent",c)

Următoarele tipuri de evenimente sunt suportate

  • SoEvent -- orice tip de evenimente
  • SoButtonEvent -- toate evenimentele butoanele /rotiță mouse
  • SoLocation2Event -- evenimente mișcări 2D (mișcările normale ale mouse-lui)
  • SoMotion3Event -- evenimentele mișcări 3D (normale pentru spaceball)
  • SoKeyboardEvent -- evenimente de tastare a tastelor cu săgeți sus/jos
  • SoMouseButtonEvent -- evenimentul de tastare și eliberare a butoanelor mouse
  • SoSpaceballButtonEvent -- evenimentul de tastare și eliberare a butoanelor spaceball

Funcțiile Python care pot fi înregistrate cu addEventCallback() așteaptă definirea unei bilbioteci. Funcție de modul în care evenimentul survine , biblioteca poate dispunde diferite taste. Este alocată câte o tastă pentru fiecare eveniment:

În funcție de eveniment, dicționarul poate conține diferite taste alocate.

Pentru toate evenimentele are tastele:

  • Type -- the name of the event type i.e. SoMouseEvent, SoLocation2Event, ...
  • Time -- timpul curent ca șir de caractere
  • Position -- tuple de două numere întregi, reprezentând poziția mouse-ului
  • ShiftDown -- un indicator boolean, adevărat dacă Shift a fost apăsat altfel fals
  • CtrlDown -- un indicator boolean, adevărat dacă Ctrl a fost apăsat altfel fals
  • AltDown -- un indicator boolean, adevărat dacă Alt a fost apăsat altfel fals

Pentru toate evenimentele gen apăsare de buton, adică evenimente de tip tastatură, mouse sau spațiu

  • State -- Un șir text dacă butonul este 'UP' , 'DOWN' dacă butonul este jos, sau pentru orice alt caz 'UNKNOWN'

pentru evenimentele tip apăsare tastatură:

  • Key -- caracterul tastei apăsate

pentru evenimente buton de mouse

  • Button -- Butonul apăsat, poate lua valorile BUTTON1, ..., BUTTON5 sau oricare dintre ele

pentru evenimente tip spaceball:

  • Button -- butonul apăsat poate lua valorile, BUTTON1, ..., BUTTON7 sau oricare dintre ele ANY

Și în sfârșit, evenimentele legate de deplasare:

  • Translation -- o tuplă de trei numere cu virgulă float()
  • Rotation -- un quaternion pentru rotație, adică o tuplă de patru valori exprimate cu virgulă float()

Afișați tastele apăsate și evenimentele comenzi

Această macrocomandă afișează în vizualizarea raportului tastele apăsate și comanda tuturor evenimentelor

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

Manipularea de scene grafice în Python

De asemenea, este posibil să se afișeze și să se schimbe scen în programul Python, cu modulul "pivy" - în combinație cu 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()

API-ul Python API-ul de tip pivy este creat folosind instrumentul SWIG. Pe măsură ce folosim în FreeCAD niște noduri scrise automat, pe care nu le puteți crea direct în Python. Cu toate acestea, este posibil să creați un nod prin numele său intern. Un exemplu de tipul "SoFCSelection" poate fi creată cu:

type = SoType.fromName("SoFCSelection")
node = type.createInstance()

Adăugarea și eliminarea obiectelor în / de la scena de grafică

Adăugarea de noi noduri în scena grafică poate fi făcută astfel. Aveți grijă să adăugați mereu un SoSeparator pentru a conține proprietățile formei geometrice, coordonatele și informațiile despre material ale aceluiași obiect. Următorul exemplu adaugă o linie roșie de la (0,0,0) până la (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)

Pentru a șerge pe acesta, este cimplu:

sg.removeChild(no)

Salvați sceneGraph cu o rotație într-o serie de 36 fișiere în axele X Y Z

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)

Adăugarea de widget-uri personalizate la interfață

Puteți crea widget-uri personalizate cu designerul Qt, le puteți transforma într-un script python și apoi le puteți încărca în interfața FreeCAD cu PySide.

Codul python produs de compilatorul Ui python (instrumentul care convertește fișierele qt-designer .ui în codul python), în general, arată astfel (este simplu, puteți, de asemenea, să îl codificați direct în 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))

Apoi, tot ce trebuie să faceți este să creați o referință la fereastra Qt FreeCAD, să-i inserați un widget personalizat în ea și să transferați codul Ui al acestui widget pe care tocmai l-am făcut:

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

Adăugarea unui tab în vizualizarea Combo

Următorul cod vă permite să adăugați o filă în FreeCAD ComboView, pe lângă filele "Project" și "Tasks". De asemenea, utilizează modulul uic pentru a încărca un fișier ui direct în acea filă.

# 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)

Activați sau dezactivați o fereastră

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

Deschiderea unei pagini web personalizate

import WebGui
WebGui.openBrowser("http://www.example.com")

Obținerea conținutului HTML al unei pagini Web deschise

from PySide import QtGui,QtWebKit
a = QtGui.qApp
mw = a.activeWindow()
v = mw.findChild(QtWebKit.QWebFrame)
html = unicode(v.toHtml())
print html

Recuperați și utilizați coordonatele a 3 puncte sau obiecte selectate

# -*- 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")

Listarea tuturor obeictelor

# -*- 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

Listează dimensiunile unui obiect, având în vedere numele acestuia

for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list
    print edge.Length


Funcția rezidentă cu acțiunea clicului mouse-ului

Here with SelObserver on a object select

# -*- 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):                # Delete the selected object
        App.Console.PrintMessage("removeSelection"+ "\n")

    def setSelection(self,doc):                           # Selection in ComboView
        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

Other example with ViewObserver on a object select or view

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)

căutarea și selecția tuturor elementelor de sub cursor

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)

Lista componentelor unui obiect

# -*- 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()

Lista 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")

Adăugarea unei proprietăți "Comentariu"

import Draft
obj = FreeCADGui.Selection.getSelection()[0]
obj.addProperty("App::PropertyString","GComment","Draft","Font name").GComment = "Comment here"
App.activeDocument().recompute()

Căutarea și extracția datelor

Example de cautare și decodare a informației despre un obiect.

Fiecare secțiune este independentă și este separată de diezi "############" poate fi copiată direct în consola Python sau într-o macrocomandă sau poate folosi această macrocomandă. Descrierea macrocomenzii în comentariu.

Afișajul se face în fereastra "View Report" (View > Views > View report)

# -*- coding: utf-8 -*-
# -*- 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 on Report view : Menu View > Views > report view
#
# rev:30/08/2014:29/09/2014:17/09/2015
 
from FreeCAD import Base
import DraftVecUtils, Draft, Part
 
mydoc = FreeCAD.activeDocument().Name                                     # Name of active Document
App.Console.PrintMessage("Active docu    : "+(mydoc)+"\n")
##################################################################################
 
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")
##################################################################################
 
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
App.Console.PrintMessage("sel            : "+str(sel[0])+"\n\n")          # sel[0] first 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")
##################################################################################
 
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")            
##################################################################################
 
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
App.Console.PrintMessage("sel            : "+str(sel[0])+"\n\n")          # sel[0] first object selected
##################################################################################
 
SubElement = FreeCADGui.Selection.getSelectionEx()                        # sub element name with getSelectionEx()
App.Console.PrintMessage("SubElement     : "+str(SubElement[0])+"\n\n")   # name of sub element
##################################################################################

SubElement = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length       # sub element or element name with getSelectionEx()
App.Console.PrintMessage("SubElement length: "+str(length)+"\n")          # length
##################################################################################

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")    
##################################################################################
 
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")            
##################################################################################
 
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
surface = sel[0].Shape.Area                                               # Area object complete
App.Console.PrintMessage("surfaceObjet   : "+str(surface)+"\n\n")
##################################################################################
 
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")
App.Console.PrintMessage("CenterOfMassZ  : "+str(CenterOfMass[2])+"\n\n")
##################################################################################
 
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")
##################################################################################
 
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")
##################################################################################
 
objs = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()

if len(objs) >= 1:
    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

#sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
#boundBox_= sel[0].Shape.BoundBox                                          # BoundBox of the object
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
boundBoxDiag= boundBox_.DiagonalLength                                    # Diagonal Length boundBox rectangle

App.Console.PrintMessage("boundBoxLX     : "+str(boundBoxLX)+"\n")
App.Console.PrintMessage("boundBoxLY     : "+str(boundBoxLY)+"\n")
App.Console.PrintMessage("boundBoxLZ     : "+str(boundBoxLZ)+"\n")
App.Console.PrintMessage("boundBoxDiag   : "+str(boundBoxDiag)+"\n\n")

##################################################################################
 
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")
##################################################################################
 
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")
##################################################################################
 
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
 
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")
##################################################################################
 
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
rotation = sel[0].Placement.Rotation                                      # decode Placement Rotation
App.Console.PrintMessage("rotation              : "+str(rotation)+"\n\n")
##################################################################################
 
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")
##################################################################################
 
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")
##################################################################################
 
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
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")
 
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")
 
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")
 
Rot_3 = sel[0].Placement.Rotation.Q[3]                                    # decode Placement Rotation 3
App.Console.PrintMessage("Rot_3         : "+str(Rot_3)+"\n\n")
##################################################################################
 
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
Yaw   = sel[0].Shape.Placement.Rotation.toEuler()[0]                      # decode angle Euler Yaw (Z)
App.Console.PrintMessage("Yaw            : "+str(Yaw)+"\n")
Pitch = sel[0].Shape.Placement.Rotation.toEuler()[1]                      # decode angle Euler Pitch (Y)
App.Console.PrintMessage("Pitch          : "+str(Pitch)+"\n")
Roll  = sel[0].Shape.Placement.Rotation.toEuler()[2]                      # decode angle Euler Roll (X)
App.Console.PrintMessage("Roll           : "+str(Roll)+"\n\n")
##################################################################################

import DraftGeomUtils
sel = FreeCADGui.Selection.getSelection()
vecteur = DraftGeomUtils.findMidpoint(sel[0].Shape.Edges[0])              # find Midpoint
App.Console.PrintMessage(vecteur)
Draft.makePoint(vecteur)
##################################################################################

Căutarea Manuală a unui element având eticheta sa

# Extract the coordinate X,Y,Z and Angle giving the label 
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")
##################################################################################

PS: De obiecei unghiurile sunt dat în Radian, pentru a face conversia :

  1. angle in Degrees to Radians :
    • Angle in radian = pi * (angle in degree) / 180
    • Angle in radian = math.radians(angle in degree)
  2. angle in Radians to Degrees :
    • Angle in degree = 180 * (angle in radian) / pi
    • Angle in degree = math.degrees(angle in radian)

Coordonate Carteziene

Acest cod afișează coordonatele cartesiene ale elementului selectat.

Modificați valoarea "numberOfPoints" dacă doriți o precizie mai mare sau mai mică

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

Altă metodă de afișarea a "Int" și "Float"

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"

Selectați toate obiectele în document

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

Selectarea fațetei unui obiect

# 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)                       #

Crearea unui obiect față de poziția Camerei foto

# 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

aici avem același sod simplificat

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)

Determinarea vectorului normal() la o suprafață

Acest exemplu arată modul de găsire a vectorului normal() a unei suprafețe prin căutarea parametrilor u, v ai unui punct de pe suprafață și folosirea parametrilor u, v pentru a găsi vectorul normal()

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)

Citirea și Scrierea unei Expresii

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]


Get the normal vector of a suface from a STL file

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)

you are done then run for quit:

Gui.ActiveDocument.ActiveView.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), meth)


Această pagină arată modul în care se poate construi cu ușurință o funcționalitatea avansată în Python. În acest exercițiu, vom construi un nou instrument care atrage o linie. Acest instrument poate fi apoi legat la o comandă FreeCAD și această comandă poate fi apelată de orice element al interfeței, cum ar fi un element de meniu sau un buton din bara de unelte.

Scriptul Principal

Mai întâi vom scrie un script care conține toate funcționalitățile noastre. Apoi, vom salva acest lucru într-un fișier și îl vom importa în FreeCAD, astfel încât toate clasele și funcțiile pe care le scriem vor fi disponibile pentru FreeCAD. Deci, lansați editorul de text preferat și tastați următoarele rânduri:

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.Line(self.stack[0],self.stack[1])
                shape = l.toShape()
                Part.show(shape)
                self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.callback)

Explicații detaliate

import Part, FreeCADGui
from pivy.coin import *

În Python, atunci când doriți să utilizați funcții dintr-un alt modul, trebuie să-l importați. În cazul nostru, vom avea nevoie de funcții de la Part Module, pentru crearea liniei și de la modulul Gui (FreeCADGui), pentru a accesa vizualizarea 3D. De asemenea, avem nevoie de conținutul complet al bibliotecii de monede, astfel încât să putem folosi direct toate obiectele precum coin, SoMouseButtonEvent, (eveniment mouse) etc ...

class line:

Aici definim clasa noastră principală. De ce folosim o clasă și nu o funcție? Motivul este că avem nevoie ca instrumentul nostru să rămână "în viață" în timp ce așteptăm ca utilizatorul să facă clic pe ecran. O funcție se termină atunci când sarcina sa a fost făcută, dar un obiect (o clasă definește un obiect) rămâne în viață până când este distrus.

"""This class will create a line after the user clicked 2 points on the screen"""

În Python, fiecare clasă sau funcție poate avea o descriere. Acest lucru este util în particular în FreeCAD, deoarece atunci când veți apela acea clasă în interpret, descrierea va fi afișată ca o sugestie .

def __init__(self):

Clasele Python întotdeauna trebuie să conțină o funcție __init__function, care este executată atunci când clasa este apelată să creeze un obiect. Deci, vom pune aici tot ce vrem să se întâmple atunci când instrumentul nostru de linie începe(este apelat).

self.view = FreeCADGui.ActiveDocument.ActiveView

Într-o clasă, de obicei, este de dorit să adăugați "self" înaintea unui nume de variabilă, astfel încât să fie ușor accesibilă tuturor funcțiilor din interiorul și din afara clasei respective. Aici vom folosi self.view pentru a accesa și manipula vizualizarea 3D activă.

self.stack = []

Aici vom crea o listă goală care va conține punctele în 3D trimise de funcția getpoint.

self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getpoint)

Acesta este un punct/parte importantă: Deoarece că este vorba de o o scenă coin3D, FreeCAD folosește mecanismul de apel invers, care permite unei funcții să fie apelată de fiecare dată când se întâmplă un anumit eveniment scenă. În cazul nostru, creăm un apel invers pentru evenimentele SoMouseButtonEvent și îl legăm la funcția getpoint. Acum, de fiecare dată când este apăsat sau eliberat un buton mouse-ului, funcția GetPoint va fi executată.

Rețineți că există, de asemenea, o alternativă la addEventCallbackPivy() numită addEventCallback() care exclude utilizarea pivy. Dar, din moment ce pivu este o modalitate foarte eficientă și naturală de a accesa orice parte a scenei coin, este mult mai bine să o utilizați cât de mult puteți!

def getpoint(self,event_cb):

Acum definim funcția GetPoint, care va fi executată atunci când un buton al mouse-ului este apăsat într-o vizualizare 3D. Această funcție va primi un argument, pe care îl vom numi event_cb. De la acest apel al evenimentului, putem accesa obiectul eveniment, care conține mai multe informații -mai multe informații pe această pagină (modul infohere).

if event.getState() == SoMouseButtonEvent.DOWN:

Funcția GetPoint va fi apelată când un buton al mouse-ului este apăsat sau eliberat. Dar vrem să alegem un punct 3D numai atunci când este presat (altfel am obține două puncte foarte aproape unul de celălalt). Așa că trebuie să verificăm asta

pos = event.getPosition()

Aici găsim coordonatele cursorului mouse-ului pe ecran

point = self.view.getPoint(pos[0],pos[1])

Această funcție ne dă un vector FreeCAD (x, y, z) ale punctului care se află pe planul focal, chiar sub cursorul mouse-ului. Dacă vă aflați într-o vizualizare a camerei foto, imaginați-vă camera trece prin cursorul mouse-ului și atinge planul focal. Acesta este punctul nostru 3D. Dacă suntem în vedere ortogonală, raza este paralelă cu direcția de vizualizare.

self.stack.append(point)

Noi adăugăm elementul nostru nou în stivă/morman

if len(self.stack) == 2:

Avem toate punctele necesare? dacă da, atunci să tragem linia!

l = Part.Line(self.stack[0],self.stack[1])

Aici folosim funcția line() din Part Module care a creat o linie din două vectori FreeCAD. Tot ceea ce creăm și modificăm în interiorul modulului Part, rămâne în modulul Part. Deci, până acum, am creat o piesă tip linie. Nu este legat de niciun obiect al documentului nostru activ, deci nu apare nimic pe ecran.

shape = l.toShape()

Documentul FreeCAD poate accepta decât forme din modulul Part Module. Formele sunt cel mai generic tip al Part Module. Deci, trebuie să convertim linia noastră într-o formă înainte de a o adăuga la document.

Part.show(shape)

Modulul Part Module are o funcție foarte utilă show(), care creează un obiect nou în document și se leagă la o formă. De asemenea, am putea să avem un nou obiect în primul document, apoi să-l legăm manual la formă.

self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.callback)

Deoarece am terminat cu linia noastră, să eliminăm mecanismul de apel invers, care consumă cicluri CPU prețioase.

Testing & Using the script

Acum, hai să salvăm scriptul într-un loc unde interpretul Python de la FreeCAD îl va găsi. Când importați module, interpretorul va căuta în următoarele locuri: căile de instalare python, directorul bin FreeCAD și toate directoarele modulelor FreeCAD. Deci, cea mai bună soluție este să creați un director nou într-unul din FreeCAD Mod directories și să salvați scriptul în el. De exemplu, să facem un director "MyScripts" și să salvăm scriptul nostru ca "exercise.py".

Acum, totul este gata, să începem FreeCAD, să creăm un nou document și, în interpretorul python, să tastăm:

import exercise

Dacă nu apare niciun mesaj de eroare, înseamnă că scriptul nostru de exerciții exercise a fost încărcat. Acum îi putem verifica conținutul cu:

dir(exercise)

Comanda dir() este o comandă python încorporată care listează/enumeră conținutul unui modul. Putem vedea că clasa noastră class line() este aici, așteptându-ne. Acum, să o testăm:

exercise.line()

Apoi, faceți dublu clic în vizualizarea 3D, și bingo, aici este linia noastră! Pentru a face din nou, doar tastați exercise.line() din nou, și din nou și din nou ... Vă simțiți minunat, nu-i așa?

Înregistrarea scriptului în interfața FreeCAD

Acum, pentru ca noul nostru instrument de trasat linii să fie foarte cool, ar trebui să aibă un buton pe interfață, deci să nu trebuiescă să tastăm toate acele lucruri de fiecare dată. Cea mai ușoară cale este să ne transformăm noul director MyScripts într-un atelier de lucru complet FreeCAD. Este ușor, tot ce este necesar este să plasați un fișier numit InitGui.py în directorul MyScripts. InitGui.py va conține instrucțiunile pentru a crea un nou atelier de lucru și va adăuga noul instrument. În plus, va trebui să transformăm un pic codul nostru de exerciții, astfel încât instrumentul line() este recunoscut ca o comandă oficială FreeCAD. Să începem prin a face un fișier InitGui.py și scrieți următorul cod în el:

class MyWorkbench (Workbench): 
   MenuText = "MyScripts"
   def Initialize(self):
       import exercise
       commandslist = ["line"]
       self.appendToolbar("My Scripts",commandslist)
Gui.addWorkbench(MyWorkbench())

Până acum, ar fi trebuit să fi înțeles deja scriptul de mai sus, mă gândesc eu: Creați o nouă clasă pe care o numiți MyWorkbench. Îi vom da un titlu (MenuText) și vom defini o funcție Initialize() care va fi executată atunci când atelierul de lucru este încărcat în FreeCAD. În această funcție, încărcăm conținutul fișierului de exerciții și adăugăm comenzile FreeCAD găsite în interiorul unei liste de comenzi. Apoi, facem o bară de instrumente numită "Scripturile mele" și îi atribuim comenzile noastre. În prezent, desigur, avem doar un singur instrument, astfel că lista noastră de comenzi conține doar un singur element. Apoi, odată ce atelierul nostru de lucru este gata, îl adăugăm la interfața principală.

Dar acest lucru nu va funcționa, deoarece o comandă FreeCAD trebuie să fie formatată într-un anumit mod de lucru. Deci, va trebui să transformăm puțin instrumentul nostru line(). Noul nostu script exercise.py va arăta cam așa:

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.Line(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())

Ceea ce am făcut aici? noi am transformat funcția noastră __init__() function într-o funcție Activated(), deoarece atunci când comenzile FreeCAD sunt executate, ele execută automat funcția Activated(). Am adăugat, de asemenea, o funcție GetResources (), care informează FreeCAD unde poate găsi o pictogramă pentru instrument și care va fi numele și sugestia/indicația instrumentului nostru. Orice imagine jpg, png sau svg va funcționa ca o pictogramă/iconiță, poate fi orice dimensiune, dar este mai bine să utilizați o dimensiune care este aproape de aspectul final, cum ar fi 16x16, 24x24 sau 32x32. Apoi, adăugăm class line() ca o comandă oficială FreeCAD cu metoda addCommand().

Asta este, vrem să reporniți FreeCAD și vom avea un nou atelier de lucru cu noul nostru instrument linie line!

Deci vrei mai mult?

Dacă ți-a plăcut acest exercițiu, de ce să nu încerci să îmbunătățești acest mic instrument? Sunt multe lucruri care pot fi făcute, ca de exemplu:

  • Adăugați comentarii utilizatorilor: până acum am făcut un instrument foarte subțire îmbrăcat, utilizatorul ar putea fi un pic pierdut atunci când îl utilizează. Așadar, am putea adăuga comentarii, spunându-i ce să facă în continuare. De exemplu, puteți emite mesaje către consola FreeCAD. ”Aruncați o privire” în modulul FreeCAD.Console
  • Adăugați posibilitatea de a introduce manual coordonatele punctelor 3D. Uitați-vă la funcția python input(), de exemplu,
  • Adăugați posibilitatea de a adăuga mai mult de 2 puncte
  • Adăugați evenimente pentru alte lucruri: Acum verificăm doar evenimentele butonului mouse-ului, dacă am face și ceva când mouse-ul este mutat, cum ar fi afișarea coordonatelor curente?
  • Dați un nume obiectului creat și multe alte lucruri.

Nu ezitați să vă scrieți întrebările sau ideile pe forum!


In această pagină vă vom expune cum se construiește o casetă de dialog Qt Dialog cu Qt Designer, Qt's instrumentul oficial pentru proiectarea interfețelor, apoi se convertesc în codul Pytohn, ca mai apoi să fie utilizat în interiorul FreeCAD. Voi presupune în exemplul acesta că știți cum se editează și se rulează deja scripturile Python și că puteți face lucruri simple într-o fereastră terminală, cum ar fi navigarea, etc. Trebuie să fi instalat, firește, pyqt.

Proiectarea dialogului

In aplicațiile CAD , proiectarea unei bune interfețe user UI (User Interface) este foarte importantă. Despre tot ce va face utilizatorul va fi prin intermediul unei interfețe: citirea casetelor de dialog, apăsarea butoanelor, alegerea între pictograme etc. De aceea este foarte important să vă gândiți cu atenție la ceea ce doriți să faceți, cum doriți să se comporte utilizatorul, și cum va fi fluxul de activități al acțiunii dvs.

Există câteva concepte pe care trebuie să le cunoașteți atunci când proiectați interfața:

  • Modal/non-modal dialogs: Un dialog modal apare în fața ecranului, oprind acțiunea ferestrei principale, forțând utilizatorului să răspundă la dialog, în timp ce un dialog non-modal nu vă oprește să lucrați pe fereastra principală. În unele cazuri, prima este mai bună, în alte cazuri nu.
  • Identificarea cerințelor și a opțiunilor: Asigurați-vă că utilizatorul știe ce trebuie să facă. Etichetați totul cu o descriere adecvată, utilizați sfaturi pentru sfaturi, etc.
  • Separarea comenzilor de parametrii: Aceasta se face de obicei cu butoanele și câmpurile de introducere a textului. Utilizatorul știe că dacă faceți clic pe un buton veți produce o acțiune în timp ce modificați o valoare în interiorul unui câmp de text, veți schimba un parametru undeva. În prezent, totuși, utilizatorii cunosc de obicei bine ce este un buton, ce este un câmp de intrare etc. Setul de instrumente de interfață pe care îl folosim, Qt, este un set de instrumente de ultimă oră și nu ne vom teme prea mult despre clarificarea lucrurilor, deoarece vor fi deja foarte clare de la sine.

Deci, acum că am definit bine ce vom face, este timpul să deschidem designerul qt. Să proiectăm un dialog foarte simplu, după cum urmează:

Qttestdialog.jpg

Apoi, vom folosi acest dialog în FreeCAD pentru a produce un plan dreptunghiular. S-ar putea să nu fie foarte util să produci planuri dreptunghiulare, dar va fi ușor să le schimbi mai târziu pentru a face lucruri mai complexe. Când îl deschideți, Designer Qt arată astfel:

Qtdesigner-screenshot.jpg

Este foarte simplu de utilizat. În bara din stânga aveți elemente care pot fi trase pe widget(toate instrumentele). În partea dreaptă aveți panouri care afișează tot felul de proprietăți editabile ale elementelor selectate. Deci, începeți cu crearea unui widget nou. Selectați "Dialog fără butoane", deoarece nu dorim butoanele implicite Ok / Cancel. Apoi trageți pe widget-ul 3 etichete , unul pentru titlu, unul pentru scrierea "Înălțime" și unul pentru scrierea "Lățime". Etichetele sunt simple texte care apar pe widget-ul dvs., doar pentru a informa utilizatorul. Dacă selectați o etichetă, în partea dreaptă vor apărea mai multe proprietăți pe care le puteți modifica dacă doriți, cum ar fi stilul fontului, dimensiune a, etc.

Apoi, adăugați 2 LineEdits , care sunt câmpuri de text pe care utilizatorul le poate completa, una pentru înălțime și una pentru lățime. Și tot aici putem edita proprietățile. De exemplu, de ce nu setați o valoare implicită? De exemplu, 1,00 pentru fiecare. În acest fel, atunci când utilizatorul va vedea dialogul, ambele valori vor fi deja completate și dacă este mulțumit el poate apăsa direct butonul, economisind timp prețios. Apoi, adăugați un PushButton, care este butonul pe care utilizatorul va trebui să îl apese după ce a completat cele două câmpuri.

Rețineți că selectăm aici niște controale foarte simple, dar Qt are mai multe opțiuni, de exemplu, ați putea folosi Spinboxes în loc de LineEdits, etc ... Aruncați o privire la ceea ce este disponibil, veți avea cu siguranță alte idei.

Este vorba despre tot ce trebuie să facem în Qt Designer. Un ultim lucru, totuși, să redenumim toate elementele noastre cu nume mai ușor, deci va fi mai ușor să le identificăm în scenariile noastre:

Qtpropeditor.jpg

Traducerea dialogului nostru în python

Acum, hai să salvăm widget-ul undeva. Acesta va fi salvat ca un fișier .ui, pe care îl vom converti cu ușurință în scriptul python cu pyuic. Sub Windows, programul pyuic este livrat cu pyqt (pentru a fi verificat), sub Linux probabil că va trebui să îl instalați separat plecând de la managerul de pachete (pe sistemele bazate pe debian, face parte din pachetul pyqt4-dev-tools). Pentru a face conversia, va trebui să deschideți o fereastră de terminal (sau sub Windows o fereastră cu prompt de comandă ), să navigați la locul unde ați salvat fișierul .ui și să emiteți/tastați:

pyuic mywidget.ui > mywidget.py

În Windows pyuic.py este localizat in "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" Pentru conversie creați un batch file numit "compQt4.bat:

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" -x %1.ui > %1.py

In consola Dos tastează fără extensie

compQt4 myUiFile

In Linux : to do

Deoarece FreeCAD s-a depărtat treptat de PyQt după versiunea 0.13, în favoarea PySide (Alegeți-vă PySide install building/building PySide), pentru a face fișierul bazat pe PySide acum trebuie să utilizați:

pyside-uic mywidget.ui -o mywidget.py

In Windows uic.py este localizat in "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" Pentru a crea un fișier batch "compSide.bat":

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" %1.ui > %1.py

In consola Dos tastați fără extensie

compSide myUiFile

Into Linux : to do

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" %1.ui > %1.py

In the DOS console type without extension

compSide myUiFile

Into Linux : to do

Pe unele sisteme programul este numit pyuic4 în loc de pyuic. Acest lucru va transforma pur și simplu fișierul .ui într-un script python. Dacă deschidem fișierul mywidget.py, conținutul său este foarte ușor de înțeles:

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))
        ...

După cum vedeți, are o structură foarte simplă: este creată o clasă numită Ui_Dialog, care stochează elementele de interfață ale widget-ului nostru. Această clasă are două metode, una pentru configurarea widget-ului și una pentru traducerea conținutului său, care este parte din mecanismul general Qt pentru traducerea elementelor de interfață. Metoda de configurare creează pur și simplu, unul câte unul, widget-urile așa cum le-am definit în Qt Designer și le stabilește opțiunile așa cum am decis mai devreme. Apoi, întreaga interfață este tradusă și, în sfârșit, sloturile se conectează (vom vorbi despre asta mai târziu).

Acum putem crea un nou widget și putem folosi această clasă pentru a crea interfața sa. Putem vedea deja widget-ul nostru în acțiune, punând fișierul mywidget.py într-un loc în care va fi găsit de către FreeCAD (în directorul bin FreeCAD sau în oricare dintre subdirectoarele Mod) și, în interpretul Python FreeCAD, facem:

from PySide import QtGui
import mywidget
d = QtGui.QWidget()
d.ui = mywidget.Ui_Dialog()
d.ui.setupUi(d)
d.show()

Și dialogul nostru va apărea! Rețineți că interpretorul nostru Python funcționează încă, avem o fereastră de dialog nemodal. Deci, pentru a o închide, putem (în afară de a face clic pe iconița/pictograma ei apropiată, desigur) să facem:

d.hide()

Hai să facem ceva cu fereastra noastră de dialog

Acum, că putem afișa și ascunde fereasta noastră de dialog, trebuie doar să adăugăm o ultimă parte: Să faci ceva! Dacă explorați un pic designerul Qt, veți descoperi rapid o întreagă secțiune numită "semnale și sloturi". Practic, funcționează astfel: elementele de pe widget-urile dvs. (în terminologia Qt, aceste elemente sunt ele însele widget-uri) pot trimite semnale. Aceste semnale diferă în funcție de tipul de widget. De exemplu, un buton poate trimite un semnal atunci când este apăsat și când este eliberat. Aceste semnale pot fi conectate la sloturi, care pot fi funcționalități speciale ale altor widgeturi (de exemplu, un dialog are un slot "închis" la care puteți conecta semnalul de la un buton de închidere) sau pot fi funcții personalizate. Documentația PyQt Reference Documentation afișează toate widgeturile qt, ce pot face ele și ce semnale pot trimite etc.

Ceea ce vom face aici este crearea unei noi funcții care va crea un plan definit pe înălțime și lățime și pentru conectarea acelei funcții la semnalul emis de butonul apăsat "Creare!". Deci, să începem cu importul modulelor noastre FreeCAD, punând următoarea linie în partea de sus a scriptului, unde deja importăm QtCore și QtGui:

import FreeCAD, Part

Apoi, hai să adăugăm o nouă funție la a noastră Ui_Dialog class:

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()

Apoi, trebuie să informăm Qt pentru a conecta butonul la funcție, plasând următoarea linie înainte QtCore.QMetaObject.connectSlotsByName(Dialog):

QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)

Aceasta, după cum vedeți, conectează semnalul pressed() pus de obiectul creat (butonul "Creare!"), Într-un slot numit createPlane, pe care tocmai l-am definit. Gata, asta e! Acum, ca tușă finală, putem adăuga o mică funcție pentru a crea dialogul, va fi mai ușor de apelat. În afara clasei Ui_Dialog, să adăugăm acest cod:

class plane():
   def __init__(self):
       self.d = QtGui.QWidget()
       self.ui = Ui_Dialog()
       self.ui.setupUi(self.d)
       self.d.show()

(Python amintește: the __init__ method of a class este executată automat ori de câte ori este creat un obiect nou!) Apoi, de la FreeCAD, avem nevoie doar de:

import mywidget
myDialog = mywidget.plane()

Et voila ... Acum puteți încerca tot felul de lucruri, cum ar fi de exemplu inserarea widget-ului în interfața FreeCAD (consultați pagina Code snippets) sau realizarea unor instrumente personalizate mult mai avansate, utilizând alte elemente pe widgetul tău.

Scriptul complet

Acesta este scriptul complet, pentru referințe:

# -*- coding: utf-8 -*-

# 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(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
       self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8))
       self.label_width.setText(QtGui.QApplication.translate("Dialog", "Width", None, QtGui.QApplication.UnicodeUTF8))
       self.label_height.setText(QtGui.QApplication.translate("Dialog", "Height", None, QtGui.QApplication.UnicodeUTF8))
       self.create.setText(QtGui.QApplication.translate("Dialog", "Create!", None, QtGui.QApplication.UnicodeUTF8))

   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()

Crearea unui dialog cu butoane

Method 1

Un exemplu de cutie de dialog completă cu conexiunile sale.

# -*- coding: utf-8 -*-
# Create by flachyjoe

from PySide import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)


class Ui_MainWindow(object):

     def __init__(self, MainWindow):
        self.window = MainWindow

        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(400, 300)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))

        self.pushButton = QtGui.QPushButton(self.centralWidget)
        self.pushButton.setGeometry(QtCore.QRect(30, 170, 93, 28))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton.clicked.connect(self.on_pushButton_clicked) #connection pushButton

        self.lineEdit = QtGui.QLineEdit(self.centralWidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.lineEdit.returnPressed.connect(self.on_lineEdit_clicked) #connection lineEdit

        self.checkBox = QtGui.QCheckBox(self.centralWidget)
        self.checkBox.setGeometry(QtCore.QRect(30, 90, 81, 20))
        self.checkBox.setChecked(True)
        self.checkBox.setObjectName(_fromUtf8("checkBoxON"))
        self.checkBox.clicked.connect(self.on_checkBox_clicked) #connection checkBox

        self.radioButton = QtGui.QRadioButton(self.centralWidget)
        self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20))
        self.radioButton.setObjectName(_fromUtf8("radioButton"))
        self.radioButton.clicked.connect(self.on_radioButton_clicked) #connection radioButton

        MainWindow.setCentralWidget(self.centralWidget)

        self.menuBar = QtGui.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 26))
        self.menuBar.setObjectName(_fromUtf8("menuBar"))
        MainWindow.setMenuBar(self.menuBar)

        self.mainToolBar = QtGui.QToolBar(MainWindow)
        self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)

        self.statusBar = QtGui.QStatusBar(MainWindow)
        self.statusBar.setObjectName(_fromUtf8("statusBar"))
        MainWindow.setStatusBar(self.statusBar)

        self.retranslateUi(MainWindow)

     def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton.setText(_translate("MainWindow", "OK", None))
        self.lineEdit.setText(_translate("MainWindow", "tyty", None))
        self.checkBox.setText(_translate("MainWindow", "CheckBox", None))
        self.radioButton.setText(_translate("MainWindow", "RadioButton", None))

     def on_checkBox_clicked(self):
        if self.checkBox.checkState()==0:
            App.Console.PrintMessage(str(self.checkBox.checkState())+"  CheckBox KO\r\n")
        else:     
            App.Console.PrintMessage(str(self.checkBox.checkState())+" CheckBox OK\r\n")
#        App.Console.PrintMessage(str(self.lineEdit.setText("tititi"))+" LineEdit\r\n") #write text to the lineEdit window !
#        str(self.lineEdit.setText("tititi")) #écrit le texte dans la fenêtre lineEdit
        App.Console.PrintMessage(str(self.lineEdit.displayText())+" LineEdit\r\n")

     def on_radioButton_clicked(self):
        if self.radioButton.isChecked():
             App.Console.PrintMessage(str(self.radioButton.isChecked())+" Radio OK\r\n")
        else:
             App.Console.PrintMessage(str(self.radioButton.isChecked())+"  Radio KO\r\n")

     def on_lineEdit_clicked(self):
#        if self.lineEdit.textChanged():
             App.Console.PrintMessage(str(self.lineEdit.displayText())+" LineEdit Display\r\n")

     def on_pushButton_clicked(self):
        App.Console.PrintMessage("Terminé\r\n")
        self.window.hide()

MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow(MainWindow)
MainWindow.show()

Aici este aceeași fereastră, dar cu o pictogramă pe fiecare buton.

Descărcați iconițele asociate (click rigth "Copy the image below ...)"

Icone01.png Icone02.png Icone03.png

# -*- coding: utf-8 -*-

from PySide import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)


class Ui_MainWindow(object):

     def __init__(self, MainWindow):
        self.window = MainWindow
        path = FreeCAD.ConfigGet("UserAppData")
#        path = FreeCAD.ConfigGet("AppHomePath")

        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(400, 300)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))

        self.pushButton = QtGui.QPushButton(self.centralWidget)
        self.pushButton.setGeometry(QtCore.QRect(30, 170, 93, 28))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton.clicked.connect(self.on_pushButton_clicked) #connection pushButton

        self.lineEdit = QtGui.QLineEdit(self.centralWidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.lineEdit.returnPressed.connect(self.on_lineEdit_clicked) #connection lineEdit

        self.checkBox = QtGui.QCheckBox(self.centralWidget)
        self.checkBox.setGeometry(QtCore.QRect(30, 90, 100, 20))
        self.checkBox.setChecked(True)
        self.checkBox.setObjectName(_fromUtf8("checkBoxON"))
        self.checkBox.clicked.connect(self.on_checkBox_clicked) #connection checkBox

        self.radioButton = QtGui.QRadioButton(self.centralWidget)
        self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20))
        self.radioButton.setObjectName(_fromUtf8("radioButton"))
        self.radioButton.clicked.connect(self.on_radioButton_clicked) #connection radioButton

        MainWindow.setCentralWidget(self.centralWidget)

        self.menuBar = QtGui.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 26))
        self.menuBar.setObjectName(_fromUtf8("menuBar"))
        MainWindow.setMenuBar(self.menuBar)

        self.mainToolBar = QtGui.QToolBar(MainWindow)
        self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)

        self.statusBar = QtGui.QStatusBar(MainWindow)
        self.statusBar.setObjectName(_fromUtf8("statusBar"))
        MainWindow.setStatusBar(self.statusBar)

        self.retranslateUi(MainWindow)

        # Affiche un icone sur le bouton PushButton
        # self.image_01 = "C:\Program Files\FreeCAD0.13\Icone01.png" # adapt the icon name
        self.image_01 = path+"Icone01.png" # adapt the name of the icon
        icon01 = QtGui.QIcon() 
        icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton.setIcon(icon01) 
        self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # This command reverses the direction of the button

        # Affiche un icone sur le bouton RadioButton 
        # self.image_02 = "C:\Program Files\FreeCAD0.13\Icone02.png" # adapt the name of the icon
        self.image_02 = path+"Icone02.png" # adapter le nom de l'icone
        icon02 = QtGui.QIcon() 
        icon02.addPixmap(QtGui.QPixmap(self.image_02),QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.radioButton.setIcon(icon02) 
        # self.radioButton.setLayoutDirection(QtCore.Qt.RightToLeft) #  This command reverses the direction of the button

        # Affiche un icone sur le bouton CheckBox 
        # self.image_03 = "C:\Program Files\FreeCAD0.13\Icone03.png" # the name of the icon
        self.image_03 = path+"Icone03.png" # adapter le nom de l'icone
        icon03 = QtGui.QIcon() 
        icon03.addPixmap(QtGui.QPixmap(self.image_03),QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.checkBox.setIcon(icon03) 
        # self.checkBox.setLayoutDirection(QtCore.Qt.RightToLeft) # This command reverses the direction of the button


     def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "FreeCAD", None))
        self.pushButton.setText(_translate("MainWindow", "OK", None))
        self.lineEdit.setText(_translate("MainWindow", "tyty", None))
        self.checkBox.setText(_translate("MainWindow", "CheckBox", None))
        self.radioButton.setText(_translate("MainWindow", "RadioButton", None))

     def on_checkBox_clicked(self):
        if self.checkBox.checkState()==0:
            App.Console.PrintMessage(str(self.checkBox.checkState())+"  CheckBox KO\r\n")
        else:     
            App.Console.PrintMessage(str(self.checkBox.checkState())+" CheckBox OK\r\n")
           # App.Console.PrintMessage(str(self.lineEdit.setText("tititi"))+" LineEdit\r\n") # write text to the lineEdit window !
           # str(self.lineEdit.setText("tititi")) #écrit le texte dans la fenêtre lineEdit
        App.Console.PrintMessage(str(self.lineEdit.displayText())+" LineEdit\r\n")

     def on_radioButton_clicked(self):
        if self.radioButton.isChecked():
             App.Console.PrintMessage(str(self.radioButton.isChecked())+" Radio OK\r\n")
        else:
             App.Console.PrintMessage(str(self.radioButton.isChecked())+"  Radio KO\r\n")

     def on_lineEdit_clicked(self):
          # if self.lineEdit.textChanged():
          App.Console.PrintMessage(str(self.lineEdit.displayText())+" LineEdit Display\r\n")

     def on_pushButton_clicked(self):
        App.Console.PrintMessage("Terminé\r\n")
        self.window.hide()

MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow(MainWindow)
MainWindow.show()

Aici codul pentru a afișa pictograma pe pushButton , schimba numele pentru un alt buton, (radioButton, checkBox) și calea spre pictogramă.

# Affiche un icône sur le bouton PushButton
        # self.image_01 = "C:\Program Files\FreeCAD0.13\icone01.png" # the name of the icon
        self.image_01 = path+"icone01.png" # the name of the icon
        icon01 = QtGui.QIcon() 
        icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton.setIcon(icon01) 
        self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # This command reverses the direction of the button

Comanda UserAppData dă calea utilizatorului AppHomePath dă cale de instalare a FreeCAD

#        path = FreeCAD.ConfigGet("UserAppData")
        path = FreeCAD.ConfigGet("AppHomePath")

Această comandă inversează butonul orizontal de la dreapta la stânga.

self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # This command reverses the direction of the button

Method 2

O altă metodă de a afișa o fereastră, aici,este prin crearea unui fișier QtForm.py care conține programul de antet (modul numit cu import QtForm ) și un al doilea modul care conține fereastra de cod toate aceste accesorii și codul dvs. (modulul de apelare).

Această metodă necesită două fișiere separate, dar vă permite să scurtați programul utilizând fișierul importat "QtForm.py". Apoi distribuiți cele două fișiere împreună, ele sunt inseparabile.

The file QtForm.py

# -*- coding: utf-8 -*-
# Create by flachyjoe
from PySide import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
   def _fromUtf8(s):
      return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
      return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
   def _translate(context, text, disambig):
      return QtGui.QApplication.translate(context, text, disambig)

class Form(object):
   def __init__(self, title, width, height):
      self.window = QtGui.QMainWindow()
      self.title=title
      self.window.setObjectName(_fromUtf8(title))
      self.window.setWindowTitle(_translate(self.title, self.title, None))
      self.window.resize(width, height)

   def show(self):
      self.createUI()
      self.retranslateUI()
      self.window.show()
   
   def setText(self, control, text):
      control.setText(_translate(self.title, text, None))
Fișierul apelant, care conține fereastra și codul dvs.

The file my_file.py

Conexiunile trebuie făcute, un bun exercițiu

# -*- coding: utf-8 -*-
# Create by flachyjoe
from PySide import QtCore, QtGui
import QtForm

class myForm(QtForm.Form):
   def createUI(self):
      self.centralWidget = QtGui.QWidget(self.window)
      self.window.setCentralWidget(self.centralWidget)
      
      self.pushButton = QtGui.QPushButton(self.centralWidget)
      self.pushButton.setGeometry(QtCore.QRect(30, 170, 93, 28))
      self.pushButton.clicked.connect(self.on_pushButton_clicked)
      
      self.lineEdit = QtGui.QLineEdit(self.centralWidget)
      self.lineEdit.setGeometry(QtCore.QRect(30, 40, 211, 22))
      
      self.checkBox = QtGui.QCheckBox(self.centralWidget)
      self.checkBox.setGeometry(QtCore.QRect(30, 90, 81, 20))
      self.checkBox.setChecked(True)
      
      self.radioButton = QtGui.QRadioButton(self.centralWidget)
      self.radioButton.setGeometry(QtCore.QRect(30, 130, 95, 20))
   
   def retranslateUI(self):
      self.setText(self.pushButton, "Fermer")
      self.setText(self.lineEdit, "essais de texte")
      self.setText(self.checkBox, "CheckBox")
      self.setText(self.radioButton, "RadioButton")
   
   def on_pushButton_clicked(self):
      self.window.hide()

myWindow=myForm("Fenetre de test",400,300)
myWindow.show()

Other example


Sunt tratate :

  1. icon for window, icoană afișată în colțul stânga sus a ferestrei principale
  2. horizontalSlider, glisor orizontal pentru conectare și extracție / asignarea datelor
  3. progressBar horizontal,bară de progres orizontală de conexiune și extracție / asignarea datelor
  4. verticalSlider, glisor vertical pentru conectarea și extragerea / asignarea de date
  5. progressBar vertical, bara de progres verticală conexiunea și extragerea / atribuirea de date
  6. lineEdit, line editează conexiunea sa și extragerea / asignarea datelor
  7. lineEdit
  8. doubleSpinBox,dublu spinbox conexiunea și extragerea / atribuirea de date
  9. doubleSpinBox
  10. doubleSpinBox
  11. button
  12. button
  13. radioButton with icons, butonul radio cu pictograma conexiunii bifate
  14. checkBox with icon checked and unchecked,caseta de validare cu pictograma conexiunii sale bifată și nebifată
  15. textEdit, text editează conexiunea sa și extragerea / asignarea datelor
  16. graphicsView with 2 graphes, vedere grafică cu 2 imagini și metoda de modificare a imaginii

Pagina Codului și iconițele sunt la Qt_Example

Iconiță personalizată în ComboView

Aici este un exemplu de creare a unui obiect cu proprietăți și iconiță personalizată in ComboView

Descarcă exemplul de iconiță în același director ca și macrocomenda icon Example for the macro

Utilizați o pictogramă pentru trei cazuri diferite de utilizare: icon_in_file_disk (format .png), icon_XPM_in_macro (format .XPM) și icon_resource_FreeCAD

icon personalised


import PySide
import FreeCAD, FreeCADGui, Part
from pivy import coin
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
import Draft

global path
param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")# macro path in FreeCAD preferences
path = param.GetString("MacroPath","") + "/"                        # macro path
path = path.replace("\\","/")                                       # convert the "\" to "/"


class IconViewProviderToFile:                                       # Class ViewProvider create Property view of object
    def __init__( self, obj, icon):
        self.icone = icon
        
    def getIcon(self):                                              # GetIcon
        return self.icone
        
    def attach(self, obj):                                          # Property view of object
        self.modes = []
        self.modes.append("Flat Lines")
        self.modes.append("Shaded")
        self.modes.append("Wireframe")
        self.modes.append("Points")
        obj.addDisplayMode( coin.SoGroup(),"Flat Lines" )           # Display Mode
        obj.addDisplayMode( coin.SoGroup(),"Shaded" )
        obj.addDisplayMode( coin.SoGroup(),"Wireframe" )
        obj.addDisplayMode( coin.SoGroup(),"Points" )
        return self.modes

    def getDisplayModes(self,obj):
        return self.modes

#####################################################
########## Example with icon to file # begin ########
#####################################################

object1 = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Icon_In_File_Disk")                                     # create your object
object1.addProperty("App::PropertyString","Identity", "ExampleTitle0", "Identity of object").Identity = "FCSpring"        # Identity of object
object1.addProperty("App::PropertyFloat" ,"Pitch",    "ExampleTitle0", "Pitch betwen 2 heads").Pitch  = 2.0               # other Property Data
object1.addProperty("App::PropertyBool"  ,"View",     "ExampleTitle1", "Hello world").View            = True              # ...
object1.addProperty("App::PropertyColor" ,"LineColor","ExampleTitle2", "Color to choice").LineColor   = (0.13,0.15,0.37)  # ...
#...other Property Data
#...other Property Data
#
object1.ViewObject.Proxy = IconViewProviderToFile( object1, path + "FreeCADIco.png")                                      # icon download to file
App.ActiveDocument.recompute()
#
#__Detail__:
# FreeCAD.ActiveDocument.addObject( = create now object personalized
# "App::FeaturePython",             = object as FeaturePython
# "Icon_In_File_Disk")              = internal name of your object
#
#
# "App::PropertyString",    = type of Property , availlable : PropertyString, PropertyFloat, PropertyBool, PropertyColor
# "Identity",               = name of the feature
# "ExampleTitle0",          = title of the "section"
# "Identity of object")     = tooltip displayed on mouse
# .Identity                 = variable (same of name of the feature)
# object1.ViewObject.Proxy  = create the view object and gives the icon
#
########## example with icon to file end



#####################################################
########## Example with icon in macro # begin #######
#####################################################

def setIconInMacro(self):        # def contener the icon in format .xpm
    # File format XPM created by Gimp "https://www.gimp.org/"
    # Choice palette Tango
    # Create your masterwork ...
    # For export the image in XPM format
    #     Menu File > Export as > .xpm
    # (For convert image true color in Tango color palette : 
    #     Menu Image > Mode > Indexed ... > Use custom palette > Tango Icon Theme > Convert)
    return """
            /* XPM */
            static char * XPM[] = {
            "22 24 5 1",
            " 	c None",
            ".	c #CE5C00",
            "+	c #EDD400",
            "@	c #F57900",
            "#	c #8F5902",
            "                      ",
            "                      ",
            "  ....                ",
            "  ..@@@@..            ",
            "  . ...@......        ",
            "  .+++++++++...       ",
            "  .      ....++...    ",
            "  .@..@@@@@@.+++++..  ",
            "  .@@@@@..#  ++++ ..  ",
            "  .       ++++  .@..  ",
            "  .++++++++  .@@@.+.  ",
            " .      ..@@@@@. ++.  ",
            " ..@@@@@@@@@.  +++ .  ",
            " ....@...# +++++ @..  ",
            " .    ++++++++ .@. .  ",
            " .++++++++  .@@@@ .   ",
            " .   #....@@@@. ++.   ",
            " .@@@@@@@@@.. +++ .   ",
            " ........  +++++...   ",
            " ...  ..+++++ ..@..   ",
            "    ......  .@@@ +.   ",
            "          ......++.   ",
            "                ...   ",
            "                      "};
        """

object2 = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Icon_XPM_In_Macro")                                    #
object2.addProperty("App::PropertyString","Identity","ExampleTitle","Identity of object").Identity = "FCSpring"
#...other Property Data
#...other Property Data
#
object2.ViewObject.Proxy = IconViewProviderToFile( object2, setIconInMacro(""))              # icon in macro (.XPM)
App.ActiveDocument.recompute()
########## example with icon in macro end



####################################################################
########## Example with icon to FreeCAD ressource # begin ##########
####################################################################

object3 = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Icon_Ressource_FreeCAD")                               #
object3.addProperty("App::PropertyString","Identity","ExampleTitle","Identity of object").Identity = "FCSpring"
#...other Property Data
#...other Property Data
#
object3.ViewObject.Proxy = IconViewProviderToFile( object3, ":/icons/Draft_Draft.svg")       # icon to FreeCAD ressource
App.ActiveDocument.recompute()
########## example with icon to FreeCAD ressource end

Completați un exemplu de creare a unui cub cu iconița sa

#https://forum.freecadweb.org/viewtopic.php?t=10255#p83319
import FreeCAD, Part, math
from FreeCAD import Base
from PySide import QtGui

global path
param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")# macro path in FreeCAD preferences
path = param.GetString("MacroPath","") + "/"                        # macro path
path = path.replace("\\","/")                                       # convert the "\" to "/"

def setIconInMacro(self):
    return """
        /* XPM */
        static char * xpm[] = {
        "22 22 12 1",
        " 	c None",
        ".	c #A40000",
        "+	c #2E3436",
        "@	c #CE5C00",
        "#	c #F57900",
        "$	c #FCAF3E",
        "%	c #5C3566",
        "&	c #204A87",
        "*	c #555753",
        "=	c #3465A4",
        "-	c #4E9A06",
        ";	c #729FCF",
        "                      ",
        "                      ",
        "                      ",
        "        ..   ..       ",
        "       +@#+++.$$      ",
        "       +.#+%..$$      ",
        "       &*$  &*#*      ",
        "      &   =&=  =      ",
        "   ++&  +.==   %=     ",
        "  ++$@ ..$ %=   &     ",
        "  ..-&%.#$$ &## +=$   ",
        "   .#  ..$ ..#%%.#$$  ",
        "     ;    =+=## %-$#  ",
        "     &=   ;&   %=     ",
        "      ;+ &=;  %=      ",
        "      ++$- +*$-       ",
        "      .#&&+.@$$       ",
        "      ..$# ..$#       ",
        "       ..   ..        ",
        "                      ",
        "                      ",
        "                      "};
        """

class PartFeature:
    def __init__(self, obj):
        obj.Proxy = self

class Box(PartFeature):
    def __init__(self, obj):
        PartFeature.__init__(self, obj)
        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

    def onChanged(self, fp, prop):
        try:
            if prop == "Length" or prop == "Width" or prop == "Height":
                fp.Shape = Part.makeBox(fp.Length,fp.Width,fp.Height)
        except:
            pass

    def execute(self, fp):
        fp.Shape = Part.makeBox(fp.Length,fp.Width,fp.Height)

class ViewProviderBox:
    def __init__(self, obj, icon):
        obj.Proxy  = self
        self.icone = icon
        
    def getIcon(self):
        return self.icone

    def attach(self, obj):
        return

    def setupContextMenu(self, obj, menu):
        action = menu.addAction("Set default height")
        action.triggered.connect(lambda f=self.setDefaultHeight, arg=obj:f(arg))

        action = menu.addAction("Hello World")
        action.triggered.connect(self.showHelloWorld)

    def setDefaultHeight(self, view):
        view.Object.Height = 15.0

    def showHelloWorld(self):
        QtGui.QMessageBox.information(None, "Hi there", "Hello World")

def makeBox():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Box")
    Box(a)
#    ViewProviderBox(a.ViewObject, path + "FreeCADIco.png")    # icon download to file
#    ViewProviderBox(a.ViewObject,  ":/icons/Draft_Draft.svg") # icon to FreeCAD ressource
    ViewProviderBox(a.ViewObject,  setIconInMacro(""))        # icon in macro (.XPM)
    App.ActiveDocument.recompute()

makeBox()

Utilizare QFileDialog pentru a scrie fișierul

Codul complet:

# -*- coding: utf-8 -*-
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
path = FreeCAD.ConfigGet("UserAppData")

try:
    SaveName = QFileDialog.getSaveFileName(None,QString.fromLocal8Bit("Save a file txt"),path,             "*.txt") # PyQt4
#                                                                     "here the text displayed on windows" "here the filter (extension)"   
except Exception:
    SaveName, Filter = PySide.QtGui.QFileDialog.getSaveFileName(None, "Save a file txt", path,             "*.txt") # PySide
#                                                                     "here the text displayed on windows" "here the filter (extension)"   
if SaveName == "":                                                            # if the name file are not selected then Abord process
    App.Console.PrintMessage("Process aborted"+"\n")
else:                                                                         # if the name file are selected or created then 
    App.Console.PrintMessage("Registration of "+SaveName+"\n")                # text displayed to Report view (Menu > View > Report view checked)
    try:                                                                      # detect error ...
        file = open(SaveName, 'w')                                            # open the file selected to write (w)
        try:                                                                  # if error detected to write ...
            # here your code
            print("here your code")
            file.write(str(1)+"\n")                                           # write the number convert in text with (str())
            file.write("FreeCAD the best")                                    # write the the text with ("  ")
        except Exception:                                                     # if error detected to write
            App.Console.PrintError("Error write file "+"\n")                  # detect error ... display the text in red (PrintError)
        finally:                                                              # if error detected to write ... or not the file is closed
            file.close()                                                      # if error detected to write ... or not the file is closed
    except Exception:
        App.Console.PrintError("Error Open file "+SaveName+"\n")      # detect error ... display the text in red (PrintError)

Utilizarea QFileDialog pentru a citi un fișier

Codul complet:

# -*- coding: utf-8 -*-
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
path = FreeCAD.ConfigGet("UserAppData")

OpenName = ""
try:
    OpenName = QFileDialog.getOpenFileName(None,QString.fromLocal8Bit("Read a file txt"),path,             "*.txt") # PyQt4
#                                                                     "here the text displayed on windows" "here the filter (extension)"   
except Exception:
    OpenName, Filter = PySide.QtGui.QFileDialog.getOpenFileName(None, "Read a file txt", path,             "*.txt") #PySide
#                                                                     "here the text displayed on windows" "here the filter (extension)"   
if OpenName == "":                                                            # if the name file are not selected then Abord process
    App.Console.PrintMessage("Process aborted"+"\n")
else:
    App.Console.PrintMessage("Read "+OpenName+"\n")                           # text displayed to Report view (Menu > View > Report view checked)
    try:                                                                      # detect error to read file
        file = open(OpenName, "r")                                            # open the file selected to read (r)  # (rb is binary)
        try:                                                                  # detect error ...
            # here your code
            print("here your code")
            op = OpenName.split("/")                                          # decode the path
            op2 = op[-1].split(".")                                           # decode the file name 
            nomF = op2[0]                                                     # the file name are isolated

            App.Console.PrintMessage(str(nomF)+"\n")                          # the file name are displayed

            for ligne in file:                                                # read the file
                X  = ligne.rstrip('\n\r') #.split()                           # decode the line
                print(X)                                                      # print the line in report view other method 
                                                                              # (Menu > Edit > preferences... > Output window > Redirect internal Python output (and errors) to report view checked) 
        except Exception:                                                     # if error detected to read
            App.Console.PrintError("Error read file "+"\n")                   # detect error ... display the text in red (PrintError)
        finally:                                                              # if error detected to read ... or not error the file is closed
            file.close()                                                      # if error detected to read ... or not error the file is closed
    except Exception:                                                         # if one error detected to read file
        App.Console.PrintError("Error in Open the file "+OpenName+"\n")       # if one error detected ... display the text in red (PrintError)

Utilizare QColorDialog pentru a defini culoarea

Codul complet:

# -*- coding: utf-8 -*-
# https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QColor.html
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
path = FreeCAD.ConfigGet("UserAppData")

couleur = QtGui.QColorDialog.getColor()
if couleur.isValid():
    red   = int(str(couleur.name()[1:3]),16)    # decode hexadecimal to int()
    green = int(str(couleur.name()[3:5]),16)    # decode hexadecimal to int()
    blue  = int(str(couleur.name()[5:7]),16)    # decode hexadecimal to int()

    print(couleur)                              # 
    print("hexadecimal ",couleur.name())        # color format hexadecimal mode 16
    print("Red   color ",red)                   # color format decimal
    print("Green color ",green)                 # color format decimal
    print("Blue  color ",blue)                  # color format decimal

Use QColorDialog and create your palette colors (Standard and Customize)

This example modify the Standard color and the Customize color with the Tango FreeCAD guide.

The complete code


# -*- coding: utf-8 -*-
# https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QColor.html
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *

###############################################
##        Window colors organisation         ##
##        __________________________         ##
## StandardColor:                            ##
##                                           ##
##           Colonnes:                       ##
##           1:  2:  3:  4:  5:  6:  7:  8:  ##
##          _______________________________  ##
## Line 1:   0   6   12  18  24  30  36  42  ##
## Line 2:   1   7   13  19  25  31  37  43  ##
## Line 3:   2   8   14  20  26  32  38  44  ##
## Line 4:   3   9   15  21  27  33  39  45  ##
## Line 5:   4   10  16  22  28  34  40  46  ##
## Line 6:   5   11  17  23  29  35  41  47  ##
##                                           ##
## CustomColor:                              ##
##                                           ##
##           Colonnes:                       ##
##           1:  2:  3:  4:  5:  6:  7:  8:  ##
##          _______________________________  ##
## Line 1:   0   2   4   6   8   10  12  14  ##
## Line 2:   1   3   5   7   9   11  13  15  ##
##                                           ##
###############################################

color_Dialog   = QtGui.QColorDialog()
# FreeCAD-Tango
# Customize the colors in the standard box (in numeric mode)
#
#### Dialog line 1
color_Dialog.setStandardColor( 0, QtGui.QColor(252, 233,  79 , 0).rgba())    # Butte 1
color_Dialog.setStandardColor( 6, QtGui.QColor(237, 212,   0 , 0).rgba())    # Butte 2
color_Dialog.setStandardColor(12, QtGui.QColor(196, 160,   0 , 0).rgba())    # Butte 3
color_Dialog.setStandardColor(18, QtGui.QColor( 48,  43,   0 , 0).rgba())    # Butte 4

color_Dialog.setStandardColor(24, QtGui.QColor(138, 226,  52 , 0).rgba())    # Chameleo 1
color_Dialog.setStandardColor(30, QtGui.QColor(115, 210,  22 , 0).rgba())    # Chameleo 2
color_Dialog.setStandardColor(36, QtGui.QColor( 78, 154,   6 , 0).rgba())    # Chameleo 3
color_Dialog.setStandardColor(42, QtGui.QColor( 23,  42,   4 , 0).rgba())    # Chameleo 4
#### Dialog line 2
color_Dialog.setStandardColor( 1, QtGui.QColor(252, 175,  62 , 0).rgba())    # Orang 1
color_Dialog.setStandardColor( 7, QtGui.QColor(245, 121,   0 , 0).rgba())    # Orang 2
color_Dialog.setStandardColor(13, QtGui.QColor(206,  92,   0 , 0).rgba())    # Orang 3
color_Dialog.setStandardColor(19, QtGui.QColor( 50,  25,   0 , 0).rgba())    # Orang 4

color_Dialog.setStandardColor(25, QtGui.QColor(114, 159, 207 , 0).rgba())    # Sky Blu 1
color_Dialog.setStandardColor(31, QtGui.QColor( 52, 101, 164 , 0).rgba())    # Sky Blu 2
color_Dialog.setStandardColor(37, QtGui.QColor( 32,  74, 135 , 0).rgba())    # Sky Blu 3
color_Dialog.setStandardColor(43, QtGui.QColor( 11,  21,  33 , 0).rgba())    # Sky Blu 4
#### Dialog line 3
color_Dialog.setStandardColor( 2, QtGui.QColor(173, 127, 168 , 0).rgba())    # Plu 1
color_Dialog.setStandardColor( 8, QtGui.QColor(117,  80, 123 , 0).rgba())    # Plu 2
color_Dialog.setStandardColor(14, QtGui.QColor( 92,  53, 102 , 0).rgba())    # Plu 3
color_Dialog.setStandardColor(20, QtGui.QColor( 23,  16,  24 , 0).rgba())    # Plu 4

color_Dialog.setStandardColor(26, QtGui.QColor(233, 185, 110 , 0).rgba())    # Chocolat 1
color_Dialog.setStandardColor(32, QtGui.QColor(193, 125,  17 , 0).rgba())    # Chocolat 2
color_Dialog.setStandardColor(38, QtGui.QColor(143,  89,   2 , 0).rgba())    # Chocolat 3
color_Dialog.setStandardColor(44, QtGui.QColor( 39,  25,   3 , 0).rgba())    # Chocolat 4
#### Dialog line 4
color_Dialog.setStandardColor( 3, QtGui.QColor(239,  41,  41 , 0).rgba())    # Scarle Re 1
color_Dialog.setStandardColor( 9, QtGui.QColor(204,   0,   0 , 0).rgba())    # Scarle Re 2
color_Dialog.setStandardColor(15, QtGui.QColor(164,   0,   0 , 0).rgba())    # Scarle Re 3
color_Dialog.setStandardColor(21, QtGui.QColor( 40,   0,   0 , 0).rgba())    # Scarle Re 4

color_Dialog.setStandardColor(27, QtGui.QColor( 52, 224, 226 , 0).rgba())    # FreeTea 1
color_Dialog.setStandardColor(33, QtGui.QColor( 22, 208, 210 , 0).rgba())    # FreeTea 2
color_Dialog.setStandardColor(39, QtGui.QColor(  6, 152, 154 , 0).rgba())    # FreeTea 3
color_Dialog.setStandardColor(45, QtGui.QColor(  4,  42,  42 , 0).rgba())    # FreeTea 4
#### Dialog line 5
color_Dialog.setStandardColor( 4, QtGui.QColor(255, 255, 255 , 0).rgba())    # Snow White

color_Dialog.setStandardColor(10, QtGui.QColor(238, 238, 236 , 0).rgba())    # Aluminiu 1
color_Dialog.setStandardColor(16, QtGui.QColor(211, 215, 207 , 0).rgba())    # Aluminiu 2
color_Dialog.setStandardColor(22, QtGui.QColor(186, 189, 182 , 0).rgba())    # Aluminiu 3

color_Dialog.setStandardColor(28, QtGui.QColor(136, 138, 133 , 0).rgba())    # Aluminiu 4
color_Dialog.setStandardColor(34, QtGui.QColor( 85,  87,  83 , 0).rgba())    # Aluminiu 5
color_Dialog.setStandardColor(40, QtGui.QColor( 46,  52,  54 , 0).rgba())    # Aluminiu 6

color_Dialog.setStandardColor(46, QtGui.QColor(  0,   0,   0 , 0).rgba())    # Je Black
#### Dialog line 6
color_Dialog.setStandardColor( 5, QtGui.QColor(255, 255, 255 , 0).rgba())    # Snow White
color_Dialog.setStandardColor(11, QtGui.QColor(255,   0,   0 , 0).rgba())    # Aluminiu 1
color_Dialog.setStandardColor(17, QtGui.QColor(  0, 255,   0 , 0).rgba())    # Aluminiu 2
color_Dialog.setStandardColor(23, QtGui.QColor(  0,   0, 255 , 0).rgba())    # Aluminiu 3

color_Dialog.setStandardColor(29, QtGui.QColor(255, 255,   0 , 0).rgba())    # Aluminiu 4
color_Dialog.setStandardColor(35, QtGui.QColor(255,   0, 255 , 0).rgba())    # Aluminiu 5
color_Dialog.setStandardColor(41, QtGui.QColor(  0, 255, 255 , 0).rgba())    # Aluminiu 6
color_Dialog.setStandardColor(47, QtGui.QColor(  0,   0,   0 , 0).rgba())    # Je Black
color_Dialog.setStandardColor(47, QtGui.QColor(  0,   0,   0 , 0).rgba())    # Je Black

#### Customize the colors to Dialog CustomColor (in hexadecimal converted in numeric mode)
# Use the Yellow tones for tools that create objects.
# Dialog line 1
color_Dialog.setCustomColor(0, QtGui.QColor( int("fc",16),int("e9",16),int("4f",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(2, QtGui.QColor( int("ed",16),int("d4",16),int("00",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(4, QtGui.QColor( int("c4",16),int("a0",16),int("00",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(6, QtGui.QColor( int("30",16),int("2b",16),int("00",16) , 0).rgba()) # hexadecimal converted in int

# Use the Blue tones for tools that modify objects
color_Dialog.setCustomColor(8, QtGui.QColor( int("72",16),int("9f",16),int("cf",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(10,QtGui.QColor( int("34",16),int("65",16),int("a4",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(12,QtGui.QColor( int("20",16),int("4a",16),int("87",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(14,QtGui.QColor( int("0b",16),int("15",16),int("21",16) , 0).rgba()) # hexadecimal converted in int

# Use the Teal tones for view-related tools
# Dialog line 2
color_Dialog.setCustomColor(1, QtGui.QColor( int("34",16),int("e0",16),int("e2",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(3, QtGui.QColor( int("16",16),int("d0",16),int("d2",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(5, QtGui.QColor( int("06",16),int("98",16),int("9a",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(7, QtGui.QColor( int("04",16),int("2a",16),int("2a",16) , 0).rgba()) # hexadecimal converted in int

# Use the Red tones for Constraint related tools
color_Dialog.setCustomColor(9, QtGui.QColor( int("ef",16),int("29",16),int("29",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(11,QtGui.QColor( int("cc",16),int("00",16),int("00",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(13,QtGui.QColor( int("a4",16),int("00",16),int("00",16) , 0).rgba()) # hexadecimal converted in int
color_Dialog.setCustomColor(15,QtGui.QColor( int("28",16),int("00",16),int("00",16) , 0).rgba()) # hexadecimal converted in int

Color = color_Dialog.getColor()                                   # Color.name() extract the color in Hexadecimal mode (#ad7fa8)

if Color.isValid():

    print("__.name()___________")
    print("hexadecimal         ", Color.name())                   # color format hexadecimal mode 16
    red   = int(str( Color.name()[1:3]),16 )                      # decode hexadecimal to int()
    green = int(str( Color.name()[3:5]),16 )                      # decode hexadecimal to int()
    blue  = int(str( Color.name()[5:7]),16 )                      # decode hexadecimal to int()

    print("Red   color decimal ", str( Color.name()[1:3]), red )  # color format hex to decimal
    print("Green color decimal ", str( Color.name()[3:5]), green )# color format hex to decimal
    print("Blue  color decimal ", str( Color.name()[5:7]), blue ) # color format hex to decimal

    print("__.red()____________")
    print("Red   color decimal ", Color.red() )                   # extract the color RGBa with Qt (0 to 255)
    print("Green color decimal ", Color.green() )                 # extract the color RGBa with Qt (0 to 255)
    print("Blue  color decimal ", Color.blue() )                  # extract the color RGBa with Qt (0 to 255)
    print("Alpha       decimal ", Color.alpha() )                 # extract the color RGBa with Qt (0 to 255)

    print("__.redF()___________")
    print("Red   color float   ", Color.redF() )                  # extract the color RGBa with Qt (0.0 to 1.0) as FreeCAD
    print("Green color float   ", Color.greenF() )                # extract the color RGBa with Qt (0.0 to 1.0) as FreeCAD
    print("Blue  color float   ", Color.blueF() )                 # extract the color RGBa with Qt (0.0 to 1.0) as FreeCAD
    print("Alpha       float   ", Color.alphaF() )                # extract the color RGBa with Qt (0.0 to 1.0) as FreeCAD
    print("__enjoy_____________")

else:
    Color = ""


Display Image with QLabel and Gif animated with QMovie

import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import QPixmap, QMovie, QLabel
from PySide.QtCore import *
class MyLabelPatience():
    label = QtGui.QLabel()
    label.setText("<img src=" + path_Name_Image + "><b><center>Wait please</center> \n\n<center>i search the fonts !\n\n</center></b>")
    # center screen
    ecran = FreeCADGui.getMainWindow().frameGeometry()
    xF = 250; yF = 120
    xW = (ecran.width()/2) - (xF/2)
    yW = (ecran.height()/2)- (yF/2)
    label.setGeometry(xW, yW, xF, yF)
    ####
    label.setStyleSheet("QLabel {background-color : #F0C300;font: 12pt; }");
    label.setWindowFlags(Qt.WindowFlags(Qt.FramelessWindowHint))        # pas de bords (not border)
    ### un-comment for use ###############
    movie = QtGui.QMovie(path_Name_Image)    # anime le fichier Gif anime (decommenter)
    label.setMovie(movie)
    movie.start()
    ##################

patience = MyLabelPatience().label
patience.show()                    #show the image
#patience.close()                   #close the Qlabel
#MyLabelPatience().movie.start()    #start the animation (after patience.show())
#MyLabelPatience().movie.stop()     #stop animation
  • Example QLabel with image and text
Example QLabel with image


  • Example QLabel with image animated Gif
Example animated Gif

Câteva comenzi utile

# Here the code to display the icon on the '''pushButton''', 
# change the name to another button, ('''radioButton, checkBox''') as well as the path to the icon,

       # Displays an icon on the button PushButton
       # self.image_01 = "C:\Program Files\FreeCAD0.13\icone01.png" # he name of the icon
       self.image_01 = path+"icone01.png" # the name of the icon
       icon01 = QtGui.QIcon() 
       icon01.addPixmap(QtGui.QPixmap(self.image_01),QtGui.QIcon.Normal, QtGui.QIcon.Off)
       self.pushButton.setIcon(icon01) 
       self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # This command reverses the direction of the button


# path = FreeCAD.ConfigGet("UserAppData") # gives the user path
  path = FreeCAD.ConfigGet("AppHomePath") # gives the installation path of FreeCAD

# This command reverses the horizontal button, right to left
self.pushButton.setLayoutDirection(QtCore.Qt.RightToLeft) # This command reverses the horizontal button

# Displays an info button
self.pushButton.setToolTip(_translate("MainWindow", "Quitter la fonction", None)) # Displays an info button

# This function gives a color button
self.pushButton.setStyleSheet("background-color: red") # This function gives a color button

# This function gives a color to the text of the button
self.pushButton.setStyleSheet("color : #ff0000") # This function gives a color to the text of the button

# combinaison des deux, bouton et texte
self.pushButton.setStyleSheet("color : #ff0000; background-color : #0000ff;" ) #  combination of the two, button, and text

# replace the icon in the main window
MainWindow.setWindowIcon(QtGui.QIcon('C:\Program Files\FreeCAD0.13\View-C3P.png'))

# connects a lineEdit on execute
self.lineEdit.returnPressed.connect(self.execute) # connects a lineEdit on "def execute" after validation on enter
# self.lineEdit.textChanged.connect(self.execute) # connects a lineEdit on "def execute" with each keystroke on the keyboard

# display text in a lineEdit
self.lineEdit.setText(str(val_X)) # Displays the value in the lineEdit (convert to string)

# extract the string contained in a lineEdit
 val_X = self.lineEdit.text() # extract the (string) string contained in lineEdit
 val_X = float(val_X0)        # converted the string to an floating
 val_X = int(val_X0)          # convert the string to an integer

# This code allows you to change the font and its attributes
       font = QtGui.QFont()
       font.setFamily("Times New Roman")
       font.setPointSize(10)
       font.setWeight(10)
       font.setBold(True) # same result with tags "<b>your text</b>" (in quotes)
       self.label_6.setFont(font)
       self.label_6.setObjectName("label_6")
       self.label_6.setStyleSheet("color : #ff0000") # This function gives a color to the text
       self.label_6.setText(_translate("MainWindow", "Select a view", None))

Folosind caracterele cu accente, primești eroarea:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

Câteva soluții sunt posibile .

# conversion from a lineEdit
App.activeDocument().CopyRight.Text = str(unicode(self.lineEdit_20.text() , 'ISO-8859-1').encode('UTF-8'))
DESIGNED_BY = unicode(self.lineEdit_01.text(), 'ISO-8859-1').encode('UTF-8')

sau cu procedura

def utf8(unio):
    return unicode(unio).encode('UTF8')

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 9: ordinal not in range(128)

# conversion
a = u"Nom de l'élément : "
f.write('''a.encode('iso-8859-1')'''+str(element_)+"\n")

sau cu procedura

def iso8859(encoder):
    return unicode(encoder).encode('iso-8859-1')

sau

iso8859(unichr(176))

sau

unichr(ord(176))

sau

uniteSs = "mm"+iso8859(unichr(178))
print(unicode(uniteSs, 'iso8859'))

Relevant Links


Dezvoltarea aplicațiilor în FreeCAD

Licențe utilizate sub FreeCAD

FreeCAD utilizează două licențe diferite, una pentru aplicația în sine și una pentru documentație:

Lesser General Public Licence, version 2 or superior (LGPL2+) Toate sursele de cod FreeCAD poate fi găsit aici official Git repository

Creative Commons Attribution 3.0 License (CC-BY-3.0) For the documentation on http://www.freecadweb.org

See FreeCAD's debian copyright file pentru mai multe detalii despre licențele utilizate de diferitele componente open source găsite în FreeCAD

Impactul licențelor

Mai jos este o explicație mai prietenoasă despre ceea ce înseamnă licența LGPL pentru dvs.:

Toți utilizatorii

Toți utilizatorii pot folosi, copia, modifica, redistribui, FreeCAD în mod gratuit, fără nici o restricție. Copia dvs. de FreeCAD este a dvs., precum și fișierele pe care le produceți cu FreeCAD.Nu sunteți obligați să actualizeze FreeCAD după un anumit timp. nici să schimbați utlizarea FreeCAD. Utilizarea FreeCAD nu le obligă la nici un fel de contract sau obligație.

Codul sursă al FreeCAD este public și poate fi inspectat. Prin urmare, este posibil să verificați că nu se fac lucruri fără știrea dvs., de exemplu prin trimiterea datelor dvs. private undeva.

Utilizatorii Profesionali

Utilizatorii profesionali pot folosi FreeCAD în mod liber, pentru orice fel de muncă privată, comercială sau instituțională. Orice versiune de FreeCAD poate fi instalată și instalată oriunde, de ori câte ori doriți. Puteți de asemenea să modificați și să adaptați FreeCAD pentru scopurile dvs. fără nici o restricție. Cu toate acestea, nu puteți face dezvoltatorii FreeCAD răspunzători pentru orice daune comerciale sau pierderi care pot rezulta din utilizarea FreeCAD.

Deavoltatorii Open Source

Puteți utiliza FreeCAD ca bază pentru a vă dezvolta propria aplicație sau o puteți extinde prin crearea de module noi pentru aceasta. Dacă FreeCAD este încorporat în propria dvs. aplicație, aveți posibilitatea să alegeți dintre licența GPL sau LGPL sau orice altă licență compatibilă cu LGPL pentru a permite utilizarea muncii dvs. în software-ul proprietar sau nu. Dacă dezvoltați un modul care să fie folosit ca extensie și nu includeți codul FreeCAD în el, puteți alege orice licență dorită. Cu toate acestea, dacă doriți să o utilizați cât de mult puteți, este o idee bună să utilizați aceeași licență ca FreeCAD în sine, astfel încât să poată fi accesată mai ușor în alte module viitoare sau chiar în FreeCAD.

Commercial developers

Puteți utiliza FreeCAD ca bază pentru propria aplicație și nu sunteți forțați să creați aplicația dvs. ca open source. Cu toate acestea, LGPL necesită două elemente de bază: 1) să informeze în mod clar utilizatorii că aplicația dvs. utilizează FreeCAD și FreeCAD este licențiată de LGPL și 2) să vă separați în mod clar propria aplicație de componentele FreeCAD. Acest lucru se face de obicei printr-o legătură dinamică cu componentele FreeCAD, permițând utilizatorilor să o modifice sau să pună la dispoziția utilizatorilor codul sursă al FreeCAD, precum și modificările aduse de dvs la acesta. Veți primi sprijin de la dezvoltatorii FreeCAD, atâta timp cât acest ajutor nu este pe o ”stradă cu sens unic”.

Fișiere

Modelele și alte fișiere create cu FreeCAD nu sunt supuse niciunei licențe menționate mai sus și nu sunt legate de nici un fel de restricție sau de proprietate. Fișierele dvs. sunt cu adevărat ale tale. Puteți seta proprietarul fișierului și puteți specifica propriile condiții de licență pentru fișierele pe care le produceți în cadrul FreeCAD, prin meniul Fișier -> Informații despre proiect.

Declarația dezvoltatorului principal

Știu că discuția despre "dreptul" licenței pentru open source a ocupat o parte semnificativă a lățimii de bandă a internetului și acesta este motivul pentru care, în opinia mea, FreeCAD ar trebui să aibă fie sub această licență LGPL.

Am ales licențele LGPL și GPL pentru proiect, știu că există pro și anti LGPL și vă voi da câteva motive pentru această decizie.

FreeCAD este un amestec între o bibliotecă și o aplicație, deci GPL ar fi un pic mai puternic pentru aceasta. Aceasta ar împiedica scrierea de module comerciale pentru FreeCAD deoarece ar preveni legarea cu bibliotecile de bază FreeCAD. Puteți să întrebați de ce module comerciale ? Prin urmare, Linux este un bun exemplu. Ar fi Linux atât de reușit dacă Biblioteca GNU C ar fi GPL și, prin urmare, ar împiedica legarea aplicațiilor non-GPL? Și totuși, îmi place libertatea Linuxului și doresc să pot utiliza driverul grafic NVIDIA 3D. Înțeleg și accept motivul pentru care NVIDIA nu dorește să dea codul driverului. Muncim toți pentru întreprinderi/firme, și avem nevoie de bani, trebuie să cumpărăm cel puțin alimente... Deci, pentru mine, coexistența open source și a a programelor proprietar nu este un lucru rău, atunci când se supune regulilor LGPL. Aș dori să văd un programator care scrie procesul de import/export Catia pentru FreeCAD și să-l distribuie gratuit sau pentru niște bani. Nu-mi place să-l forțez să dea mai mult decât vrea el. Nu ar fi bine nici pentru el nici pentru FreeCAD.

Această decizie se face numai pentru nucleul sistemul FreeCAD. Fiecare scriitor al unui modul de aplicație poate lua propria decizie.

Jürgen Riegel
—15 October 2006


Tracker este locul pentru aː raporta bug-uri (eroare sau disfuncționalitate neprevăzută) , trimiteți cereri de funcționalități, patch-uri sau cereți să vă îmbinați codul corector propriu dacă ați dezvoltat ceva folosind Git. Dispozitivul de urmărire este împărțit în Ateliere "Workbenches", așa că vă rugăm să fiți preciși și să vă înscrieți cererea în subsecțiunea corespunzătoare. În caz de îndoială, lăsați-o în secțiunea "FreeCAD".


Flux de lucru recomandat

Bugreport-workflow.png

După cum se arată în diagrama de mai sus, înainte de a crea tichete, vă rugăm să căutați mereu în forumurile și bugtracker pentru a afla dacă problema dvs. este o problemă cunoscută. Acest lucru economisește o mulțime de timp / muncă pentru dezvoltatori și voluntari care ar putea petrece timpul respectiv, făcând chiar mai minunat acest FreeCAD.

Raportarea erorilor

Dacă credeți că ați găsit un bug (disfuncționalitate sau eroare), sunteți binevenit să îl raportați atâta timp cât ați urmat pas cu pas următoarele elemente:

  • Asigurați-vă că utilizați cea mai recentă versiune de FreeCAD. NOTEː eroarea dumneavoastră ar putea fi deja rezolvată în versiunea în Dezvoltare(instabilă). Utilizatorii medii utilizează varianta stabilă a FC.
  • Asigurați-vă ca bug-ul este un adevărat bug, asta e, câteodată ar putea să meargă dar să nu fie. Asigurați-vă că aceeași eroare nu a fost raportată înainte , căutând în bugtracker și forum.
    • Nu uitațiː dacă nu sunteți siguri , vă rog nu ezitați să explicați problema/bug-ul pe Help forum și întrebați ce este de făcut.
    • Notăː înainte de a posta pe forum vă rugăm citiți Forum Guidelines.
  • Descrieți cât mai clar posibil problema, și cum poate fi reprodusă. Dacă noi nu putem verifica eroarea, nu putem să o rezolvăm.
    • Aceasta înseamnă raportarea într-un mod clar, bine formatat, pas cu pas astefel încât și un amator să o poată reproduce.
    • Recomandatː Screenshots a erorii este de asemenea foarte folositor a fi inclus. Useri de Windows: vp rugăm nu atașați capturi de ecran în Word sau format PDF. Utilizați instrumentul Windows Snipping pentru a salva captura ca imagine PNG.
    • Recomandatː Chiar mai bine, un Animated gif or Screencast ar crește posibilitatea de areproduce problema.
  • Adaugați un exemplul de fișier FreeCAD (.FCStd file) astfel ca devs/testers să poată reproduce ușor eroarea/disfuncționalitatea.
    • Vă rugăm nu arhivați fișierul *.FCStd, este deja zipped.
    • Atașametnele fișierului sunt limitatea ca mărime. Dacă fișierul dvs *.FCStd este prea marea pentru a fi atașat, puteți utiliza online storage service (multe sunt gratuite ca de exemplu Google Drive, Microsoft OneDrive, Dropbox).
  • Includeți toate informațiile din butonul "Copy to Clipboard" în dialogul Help (menu) -> About FreeCAD. fiți siguri că datele dumneavoastră includ versiunile de OCC ori OCE .
  • Vă rugăm completați un raport separat pentru fiecare bug.
  • Dacă eroarea dvs cauzează un crash in FreeCAD și sunteți pe un sistem care permite aceasta,încercați să rulați un debug backtrace și să atașați said trace la ticket. Aceasta poate salva devs foarte mult timp pentru a ținti sursa prăbușirii/crash-ului. Vezi Debugging pentru mai multe detalii.

Solicitarea de funcționalități

Dacă doriți să apară ceva în FreeCAD, care încă nu este implementat, it nu este un bug și o solicitarea de funcționalitate.

  1. IMPORTANTː Înainte de a solicita a funcționalitate potențială Feature Request please be certain that you are the first one doing so by searching the forums and the bugtracker. Dacă ați ajuns la concluzia că nu există token/tichete / discuții pre-existente, următorul pas este ...
  2. Începeți un fir de discuții de forum pentru a discuta despre cererea dvs. cu comunitatea prin Open Discussion forum.
  3. Odată ce comunitatea este de acord că aceasta este o caracteristică valabilă, puteți deschide un token/tiket pe tracker(file it under feature request instead of bug).
  • NOTE #1 Pentru a păstra lucrurile organizate, nu uitați să conectați adresa URL a firului la tichet și numărul (ca legătură) în firul de pe forum.
  • NOTE #2 Rețineți că nu există garanții că dorința dvs. va fi îndeplinită.
FreeCAD Bugtracker report page - use the dropdown to correctly designate what the ticket is

Propunerea de îmbunătățiri

In cazul în care ați realizat un program de corectare a unei erori/disfuncționalități, o extensie sau orice altceva care poate fi de uz public în FreeCAD, creați un patch utilizând instrumentul Git diff și trimiteți-o pe același bug tracker (ca pe un patch).

Addendumː dezvoltarea de FreeCAD a fost comutată pe GitHub astfel încât fluxul de lucru pentru trimiterea de patch-uri a fost mult îmbunătățit / simplificat prin trimiterea solicitărilor de tragere (Pull Requests) .

  • Deschideți un fir de forum din subforumul pentru dezvoltatori pentru a vă anunța și discuta despre patch-ul dvs.
  • Trimiteși PR dvs spre FreeCAD GitHub repo. Asigurați-vă că ați conectat firul forumului la rezumatul comisiei git.
  • Inserați legătura PR în forumul de discuții pentru a fi testat de către devs/testers.
  • Fiți prezenți la discuție, astfel încât codul dvs. să poată fi înbinat mai eficient.

NOTEː comunitatea FreeCAD recomandă să discuți mai întâi despre orice revizuire mare a codului sursă în avans pentru a salva timpul la toată lumea.

Solicitarea fuzionare

(Same guidelines as Submiting patches)

Dacă ați creat o modificarea (git branch) conținând schimbări pe care le-ați dori să fie topite/fuzionate în codul FreeCAD, puteți solicita ca ramura dvs. să fie revizuită și integrată în cazul în care dezvoltatorii FreeCAD sunt de acord cu aceasta. Mai întâi trebuie să vă publicați modificarea într-un depozit public git (github, gitlab, bitbucket, sourceforge etc ...) și apoi să dați URL-ul modificării dvs în cererea dvs. de fuziune.

MantisBT sfaturi și Trucuri

MantisBT Markup

MantisBT (Mantis Bug Tracker) are propria marcă.

  • @mention - funcționează ca pe GitHub unde, dacă adăugați prefixul "@" la un nume de utilizator, acesta va primi un e-mail pe care a fost "menționat" într-un thread de tichet
Mantisbt-mention-example.jpg
  • #1234 - Prin adăugarea unei etichete de tip hash tag în fața unui număr, va fi prezentată o comandă rapidă către un link către un alt bilet în MantisBT.
    Note: Dacă survolați cu mouse-ul peste un bilet, acesta vă va afișa rezumatul + dacă biletul este închis, acesta va fi blocat ca#1234.
Mantisbt-ticket-shortcut-example.jpg
  • ~5678 - o comandă rapidă care face legătura cu o notă de bug în cadrul unui bilet. Acest lucru poate fi folosit pentru răspunsul cuiva în cadrul firului. Fiecare persoană va avea un număr unic de postare #### la numele de utilizator. Dacă priviți imaginea din exemplu, veți observa că comanda rapidă face referire la numărul ticket number:comment number al biletului menționat
Mantisbt-comment-shortcut-example.jpg
  • <del></del> - Utilizând această etichetă aceasta va strikeout text.
Mantisbt-strikeout-text-example.jpg
  • <code></code> - pentru a prezenta o linie sau un bloc de cod, utilizați această etichetă și aceasta o va colora și o va diferenția elegant.
Mantisbt-colorized-code-example.jpg

MantisBT BBCode

În plus față de mai sus Tracker/MantisBT ̠Markup are de asemenea posibilitatea să utilizeze formatul BBCode. Pentru o listă completă, vezi BBCode plus plugin page. aici este o listă a etichetelor BBCode suportateː
[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

Mai jos sunt cuvintele cheie speciale pentru plugin-ul MantisBT Source-Integration, care vor face legătura cu repo-ul FreeCAD GitHub. Vezi Tracker#GitHub_and_MantisBT.

  • c:FreeCAD:git commit hash: - c stands for 'commit'. FreeCAD stands for the FreeCAD GitHub repo. 'git commit hash' is the specific git commit hash to reference. Note: the trailing colon is necessary. Exampleː cːFreeCADː709d2f325db0490016807b8fa6f49d1c867b6bd8ː
  • d:FreeCAD:git commit hash: - similar to the above, d stands for 'diff' which will provide a Diff view of the commit. Exampleː dːFreeCADː709d2f325db0490016807b8fa6f49d1c867b6bd8ː
  • p:FreeCAD:pullrequest: - similar to the above, p stands for Pull Request. Exampleː pːFreeCADː498ː
Mantisbt-source-integration-markup.jpg


GitHub și MantisBT

FreeCAD bugtracker are un plug-in numit Source Integration care în principiu care, în esență, leagă atât repo-ul FreeCAD GitHub cât și tracker-ul nostru MantisBT. El facilitează urmărirea și asocierea git commits cu tichetele lor MantisBT. 'Pluginul Source Integration scanează mesajele de git commits pentru anumite cuvinte cheie pentru a executa următoarele acțiuni:'

Notă Cuvintele cheie de mai jos trebuie adăugate în git commit message și nu în subiectul PR

Referința distantă a unui tichet

Folosind acest model, se va asocia automat o comanda git cu un ticket ( 'Notă:' acest lucru nu va închide biletul.)Formatul MantisBT va recunoaște:

  • bug #1234
  • bugs #1234, #5678
  • issue #1234
  • issues #1234, #5678
  • report #1234
  • reports #1234, #5678

For the inquisitive here is the regex MantisBT uses for this operation:
/(?:bugs?|issues?|reports?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i

Rezolvarea la distanță a unui tichet

Formatul MantisBT va recunoaște:

  • fix #1234
  • fixed #1234
  • fixes #1234
  • fixed #1234, #5678
  • fixes #1234, #5678
  • resolve #1234
  • resolved #1234
  • resolves #1234
  • resolved #1234, #5678
  • resolves #1234, #5678

For the inquisitive here is the regex MantisBT uses for this operation:
/(?:fixe?d?s?|resolved?s?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i

Înrudite


Acest articol explică pas cu pas how to compile FreeCAD on Windows.

Premise

At first you must install the following required programs ad libraries:

Programe necesare

  • Git Aici sunt câteva dintre alternative ca GitCola, Tortoise Git, și altele.
  • CMake versiunea 2.x.x sau Cmake 3.x.x
  • Python >2.5 (Acest lucru este necesar numai dacă NU utilizați Libpack. Libpack este livrat încpând cu Python(2.7.x) potrivit pentru compilarea și rularea FreeCAD)
  • Git (There are also a GUI frontends available for Git, see the next section.)
  • CMake version 3.11.x - 3.14.x. Note: Usually one cannot take the latest CMake version. Therefore only use a CMake version in the range specified on this page!

It is recommended to use the option Add CMake to the system PATH for all users when installing CMake. Then you can later easily access CMake also from the command line/powershell.

  • LibPack (also called FreeCADLibs). This is a set of libraries necessary to compile FreeCAD on Windows. Depending on the FreeCAD version you want to compile, you must download the corresponding LibPack. For example to compile FreeCAD 0.18, download either the 32bit or the 64bit version of the LibPack for 0.18, to compile the latest development version 0.19, download the LibPack for 0.19 (there is only a 64bit version).

Just download the LibPack, you will unpack and set it up later.

Note: It is recommended to use the same compiler MS Visual Studio (MSVC) version the LibPack is designed for. This assures that the compilation and the execution of the compiled FreeCAD.exe succeeds. So you should for example be able to compile FreeCAD 0.18 using the LibPack for 0.19 and MSVC 15 but you you might get problems compiling FreeCAD 0.18 using the LibPack for 0.18 and MSVC 15 because the LibPack for 0.18 is designed to be built with MSVC 12.

Optional programs

  • Python 3.x. A separate python installation is not mandatory since the LibPack contains Python. However, to be able to test later your FreeCAD build it is useful to have a standalone Python installation. It is recommended to use not the latest version, but the prior version (e.g. not Python 3.7 but 3.6).
  • A GUI frontend for Git. There are several frontends available, see this list. The main benefit of a frontend is that you don't have to learn the Git commands to get the source code of FreeCAD or to send patches to the GitHub repository of FreeCAD.

In the following we describe source code handling using the frontend TortoiseGit. This frontend integrates directly to Windows file explorer and has a large user community to get help in case you have problems.

  • NSIS This is the program to generate the Windows installer of FreeCAD. (Information: For FreeCAD 0.17 and older the program WiX was used to create the installer.)

Codul sursă

Utilizați Git (de preferință)

Now you can get the source code of FreeCAD:

Using a frontend

When using the Git frontend TortoiseGit:

  1. Create a new folder where the source code should be.
  2. Right-click on this folder in the Windows file explorer and select in the context menu Git Clone.
  3. A dialog will appear. Use there as URL for the FreeCAD repository

https://github.com/FreeCAD/FreeCAD.git

and click OK.

Now the source code is downloaded and its folder becomes a folder tracked by Git.

Using the command line

Pentru a crea o ramură de urmărire locală și pentru a descărca codul sursă, trebuie să deschideți un terminal (promp de comandă) și cd(change directory) în directorul pe care doriți să plasați codul sursă, apoi tastați:

git clone https://github.com/FreeCAD/FreeCAD.git

Compilator

Sub Windows, compilatorul implicit este MS Visual Studio. CI utilizează versiunea din 2013.

The default (recommended) compiler is MS Visual Studio (MSVC). Though it may be possible to use other compilers using Cygwin or MinGW gcc it is not tested or ported so far.

You can get a free version of MSVC (for OpenSource usage) by downloading the Community edition of MS