Welcome! Log In Create A New Profile

Advanced

Creare modelli in FreeCAD

Posted by onekk 
Creare modelli in FreeCAD
February 07, 2020 12:57PM
Buongiorno, questo vorrebbe essere il post iniziale di una serie di articoli per creare modeli usando FreeCAD,

Perché? semplicemente perché in genere si consiglia OpenSCAD che però ha alcuni gravi problemi.

- Non supporta la programmazione (definisce un modello staticamente) e poi usa le variabili in modo "strano" o per meglio dire non puoi modificare una "variabile", cioè riassegnarci il valore, se non a certe condizioni.

- il motore grafico non è il massimo e in genere ho trovato una serie di difficoltà a fargli fare cose un pochino più elevate di quelle semplici.

- è solo un modellatore.

FreeCAD dal canto suo ha si alcuni problemini, ma sta evolvendo molto bene e in più è programmabile in Python cosa che ne fa un ottimo ambiente per progettare e convertire il progetto in file STL e anche AMF se serve (AMF ad esempio può definire oggetti per stampanti a due o più colori in modo relativamente semplice, io però non ho provato).

In pratica dopo un iniziale rodaggio, il motore di FreeCAD è davvero potente e permette di definire in modo complesso molte cose, ad esempio è possibile riusare il codice in quanto python è proprio un linguaggio orientato agli oggetti (oggetti della programmazione ad oggetti ovviamente).

Per cominciare è necessario procurarsi FreeCAD, niente di più semplice perché è possibile scaricare un AppImage cioè un file che contiene tutto quello che serve per far girare FreeCAD in modo poco dipendente dal computer, tanto è vero che lo si può tranquillamente caricare su una chiavetta e usarlo dove si vuole.

L'unica cosa da decidere è che sistema operativo usare, io uso Linux è perciò ho quella versione.

Sito di FreeCAD

Le AppImage per FreeCAD

Se usate Windows consiglio le portable builds

The portable builds do not require an installation. Extract the file using 7zip and start the application by double clicking on FreeCAD.exe in the bin sub-directory of the extracted package.

In questo modo non appena una nuova versione viene rilasciata potete evitare di disinstallare ed installare quell nuova eventualemente potete tenere sia la versione di sviluppo che quella stabile senza avere rogne, basta usare due directory diverse.

Quando avete FreeCAD installato dovete capire come usarlo.

Progetteremo ad oggetti ed usando la potente modalità di scripting.


appena avviato FreeCAD vi troverete una schermata simile a questa.



Dovreste avere però la lingua in Inglese, per cambiarla Edit > Preferences > General - Language e scegliete quella che più vi piace (e che riuscite a capire ovviamente).

Per entrare nel gioco, dovrete scegliere un file o crearne uno, meglio crearlo a mano e sceglierlo poi dato in base al tipo di estensione FreeCAD vi porta nel corretto ambiente.

Nel nostro caso l'ambiente è quello di Scripting perciò ci servira un file con l'estensione .py.

Potete usare l'editor interno o un programma più adatto alla programmazione in Python, scegliete voi.

Per gli esempi rimaniamo sull'editor interno.

create un file con Notepad (o altro editor) oppure create semplicemente un file vuoto e chiamatelo pippo.py

Apritelo in FreeCAD e vi troverete in una schermata simile a questa:



ci siamo quasi, avete bisogno però di attivare due funzioni:

Visualizza > Pannelli e selezionate Report e Console Python

dovreste trovarvi dopo aver ridimensionato opportunamente le finestre con una configurazione simile a questa:



Il pannello Report vi visualizzaeà gli errori quello della console python vi permetterà di fare molte altre cose.

Per cominciare inserite queste righe nella finestra dell'editor:

import FreeCAD
from FreeCAD import Base, Vector
import Part

Servono per dire all'interprete Python cosa vogliamo importare, nel nostro caso:

import FreeCAD

Serve a dire a FreeCAD di importare se stesso, sembra stupido ma l'interprete python di FreeCAD è un interprete python a tutti gli effetti, e quindi dovete dirgli cosa fare


from FreeCAD import Base, Vector

Queste riga serve per semplificare di molto la scrittura altrimenti avremmo dovuto scrivere ogni volta ad esempio:

FreeCAD.Base

dato che Base e Vector sono molto usati ci risparmiamo una serie di battute non indifferenti

import Part

Qui importiamo il modulo Part di FreeCAD che ci permetterà di disegnare effettivamente la parte




Battiamo (o importiamo con il copia incolla da questo post)

DOC = FreeCAD.activeDocument()

def clear_doc():
    """
    Clear the active document deleting all the objects
    """
    for obj in DOC.Objects:
        DOC.removeObject(obj.Name)

if DOC is None:
    FreeCAD.newDocument("Pippo")
    FreeCAD.setActiveDocument("Pippo")
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()

# EPS= tolerance to uset to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5

DOC.addObject("App:grinning smileyocumentObjectGroup", CMPN_NAME)


Ahime c'è un problema, nella visualizzazione la parte che contiene [: D] viene tradotta con la faccina grinning smiley, uno schifo, però tenetene conto e sostitute la faccina con : D senza lo spazio in mezzo

Da qui possiamo cominciare a definire alcune cose:

e_rad = 10
e_alt = 20

obj1 = DOC.addObject("Part::Cylinder", "int_cyl")
obj1.Angle = 180
obj1.Radius = e_rad
obj1.Height = e_alt
obj1.Placement = FreeCAD.Placement(Vector(0, 0, e_alt), Base.Rotation(Vector(0, 0, 0), 0))

Vediamo di spiegare cosa abbiamo fatto:
- Abbiamo creato un oggetto tipo cilindro chiamato int_cyl e aggiunto al documento DOC (questa è la riga obj1 = ...)
- Abbiamo assegnato i corretti valori alle proprietà dell'oggetto obj1
- Lo abbiamo posizionato dove volevamo obj1.Placement(...

Anche solo in queste poche righe di codice potete vedere l'utilità dell' from FreeCAD import .... di prima, altrimenti avremmo dovuto scrivere:

obj1.Placement = FreeCAD.Placement(FreeCAD.Vector(0, 0, e_alt), FreeCAD.Base.Rotation(FreeCAD.Vector(0, 0, 0), 0))

Una noia mortale.

Oggi finiamo qui, mi interesserebbe sapere se qualcuno segue ed è interessato alla cosa.

Saluti

Carlo D.

Edited 5 time(s). Last edit at 02/08/2020 10:21AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
February 08, 2020 10:52AM
Secondo round.

Mi sono accorto che ho dato molte cose per scontato

Riporto prima di tutto il codice completo dell'esempio


import FreeCAD
from FreeCAD import Base, Vector
import Part

DOC = FreeCAD.activeDocument()

def clear_doc():
    """
    Clear the active document deleting all the objects
    """
    for obj in DOC.Objects:
        DOC.removeObject(obj.Name)

if DOC is None:
    FreeCAD.newDocument("Pippo")
    FreeCAD.setActiveDocument("Pippo")
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()

# EPS= tolerance to uset to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5

e_rad = 10
e_alt = 20

obj1 = DOC.addObject("Part::Cylinder", "int_cyl")
obj1.Angle = 180
obj1.Radius = e_rad
obj1.Height = e_alt
obj1.Placement = FreeCAD.Placement(Vector(0, 0, e_alt), Base.Rotation(Vector(0, 0, 0), 0))


Allora, i concetti base:

FreeCAD necessita di avere un documento aperto e di questo si occupano queste lineee:


DOC = FreeCAD.activeDocument()

def clear_doc():
    """
    Clear the active document deleting all the objects
    """
    for obj in DOC.Objects:
        DOC.removeObject(obj.Name)

if DOC is None:
    FreeCAD.newDocument("Pippo")
    FreeCAD.setActiveDocument("Pippo")
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()


La prima linea assegna alla variabile DOC il compito di semplicifarci la vita e rendere FreeCAD.activeDocument() una cosa decisamente più corta.

Uso la maiuscola per denotare che è una "costante" (a dire il vero non lo è ma la possiamo considerare tale), è una convenzione di Python di scrivere le costanti con il nome tutto maisucolo.

La stessa cosa faccio con due altre vostanti EPS ed EPS_C che is usano per aumentare di un tot (piccolo a piacere ed infatti uso 0.10 mm) le dimensioni di alcune cose per essere sicuri che i particolari abbiamo punti di contatto nel caso di una unione e che taglino bene la figura nel caso di un taglio, EPS_C è metà di quella quantità in negativo, perché?

Al solito è un trucco, se creno un cilindro che deve tagliare un cubo e tutti e due poi partono da 0 il taglio non sarà perfetto specie di sotto, se aumento di EPS l'altezza del cilindro e posiziono il cilindro EPS_C (ricordate che è negativa) ad esempio su Z il cilindro partira "leggermente" sotto al cubo e lo taglierà perfettamente.

Ovviamente devo sempre tenere d'occhio le aggiunte per evitare di sommare troppe volte la "piccola quantità" che poi diventa troppo significativa.

segue una funzione comoda comoda:

def clear_doc():
    """
    Clear the active document deleting all the objects
    """
    for obj in DOC.Objects:
        DOC.removeObject(obj.Name)


Serve semplicemente per svuotare il documento e permetterci di riutilizzare lo stesso documento più volte al lancio del programma.

di questo si occupa questa parte di codice:

if DOC is None:
    FreeCAD.newDocument("Pippo")
    FreeCAD.setActiveDocument("Pippo")
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()

In pratica controlla con if DOC is None se esiste un documento attivo, nel caso non esiste ne crea uno chiamato Pippo (ovviamente potete cambiare "Pippo" con quello che volete) e assegna a questo nuovo documento creato lo stato di documento attivo, e assegna a DOC il "segnaposto" di questo documento, Se invece esiste un documento attivo, lo svuota chiamando la funzione clear_doc().

In queso modo evitiamo l'errore all'avvio del programma se non esiste nessun documento attivo. non è un metodo perfetto infatti se esiste un documento attivo lo svuotiamo quindi occhio a usare questa tecnica solo dopo aver salvato l'eventuale documento attivo.




Questa parte si occupa di creare un oggetto.

e_rad = 10
e_alt = 20

obj1 = DOC.addObject("Part::Cylinder", "int_cyl")
obj1.Angle = 180
obj1.Radius = e_rad
obj1.Height = e_alt
obj1.Placement = FreeCAD.Placement(Vector(0, 0, e_alt), Base.Rotation(Vector(0, 0, 0), 0))

Abbiamo creato un Ciliindro o meglio mezzo cilindro perché abbiamo assegnato alla proprietà Angle il valore di 180 che è una mezza rotazione, se avessimo voluto un cilindro completo avremmo messo 360.

se facciamo girare il programma con il triangolo verde in alto, vedrete che viene creato un documento Pippo e che viene mostrato la cosa, però dovrete usare questa icona in alto a sinistra :



per visualizzare la cosa, se non la vedete andate nel menu Visualizza > barre degli strumenti e assicuratevi che Vista sia spuntata.

oppure aggiungere queste due righe alla fine del file:


FreeCAD.Gui.SendMsgToActiveView("ViewFit")
FreeCAD.Gui.activeDocument().activeView().viewAxometric()

IL maggior problema è che non avete punti di riferimento per vedere le cose, io in genere uso un trucco, creo un piano usando questa funzione

def zero_plane(zp_w, zp_l):

    zero = Part.makePlane(zp_w, zp_l, Vector(0, 0, 0), Vector(0, 0, 1))

    pl2 = DOC.addObject("Part::Feature", "zero_plane")
    pl2.Shape = zero
    pl2.ViewObject.ShapeColor = (1.00, 0.41, 0.70)
    pl2.ViewObject.Transparency = 60
    pl2.Placement = FreeCAD.Placement(Vector(zp_w * -0.5, zp_l * -0.5, 0), Base.Rotation(Vector(0, 0, 0), 0))


e poi lo attivo alla fine del disegno usando:

zero_plane(100,100)

in modo da vedere il piano che mi da l'idea di dove è lo Z = 0


per cui l'esempio completo risulta questo:


import FreeCAD
from FreeCAD import Base, Vector
import Part

DOC = FreeCAD.activeDocument()

def clear_doc():
    """
    Clear the active document deleting all the objects
    """
    for obj in DOC.Objects:
        DOC.removeObject(obj.Name)

def zero_plane(zp_w, zp_l):

    zero = Part.makePlane(zp_w, zp_l, Vector(0, 0, 0), Vector(0, 0, 1))

    pl2 = DOC.addObject("Part::Feature", "zero_plane")
    pl2.Shape = zero
    pl2.ViewObject.ShapeColor = (1.00, 0.41, 0.70)
    pl2.ViewObject.Transparency = 60
    pl2.Placement = FreeCAD.Placement(Vector(zp_w * -0.5, zp_l * -0.5, 0), Base.Rotation(Vector(0, 0, 0), 0))


if DOC is None:
    FreeCAD.newDocument("Pippo")
    FreeCAD.setActiveDocument("Pippo")
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()

# EPS= tolerance to uset to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5

e_rad = 10
e_alt = 20

obj1 = DOC.addObject("Part::Cylinder", "int_cyl")
obj1.Angle = 180
obj1.Radius = e_rad
obj1.Height = e_alt
obj1.Placement = FreeCAD.Placement(Vector(0, 0, 0), Base.Rotation(Vector(0, 0, 0), 0))
DOC.recompute()

zero_plane(100,100)
DOC.recompute()

FreeCAD.Gui.SendMsgToActiveView("ViewFit")
FreeCAD.Gui.activeDocument().activeView().viewAxometric()


notate i DOC.recompute() aggiunti, servono per costringere FreeCAD a ricalcolare le cose, specie se lavorate con molti oggetti è buona cosa ricordarsi di metterli alla fine della creazione di un oggetto, forziamo il ricalcolo dell'oggetto specie se lo creaimo e poi modifichiamo delle proprietà.

alla fine dovreste avere una cosa simile a questa:



"more to come" come dicono gli inglesi

Saluti

Carlo D.

Edited 4 time(s). Last edit at 02/08/2020 11:25AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
February 09, 2020 11:03AM
Bentrovati, complichiamo le cose...

Una tecnica utile è quella di trasformare ogni cosa in "oggetto", non è un proprio oggetto nel senso stretto, perché dovremmo creare una classe e fornirla di metodi, cosa troppo complicata per l'uso quotidiano nella progettazione di piccoli oggetti.

però possiamo dare un'idea della cosa.

evito di ripetere tutto il preambolo e riporto solo la parte rilevante del codice:

# EPS= tolerance to uset to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5

def base_cyl(nome, rad, alt):
    obj1 = DOC.addObject("Part::Cylinder", nome)
    obj1.Angle = 180
    obj1.Radius = rad
    obj1.Height = alt
    obj1.Placement = FreeCAD.Placement(Vector(0, 0, 0), Base.Rotation(Vector(0, 0, 0), 0))
    DOC.recompute()

base_cyl("int_cyl", 10, 20)
zero_plane(100,100)
DOC.recompute()

FreeCAD.Gui.SendMsgToActiveView("ViewFit")
FreeCAD.Gui.activeDocument().activeView().viewAxometric()

come potete notare ho modificato leggermente il codice, mettendo alcune parti all'interno del metodo base_cyl e trasfromando alcune variabili in parametri passati al modulo.

poca roba per il momento, però la può essere migliorata in un certo modo, ad esempio rendendo il metodo una vera e propria funzione che restituisce qualcosa.

# EPS= tolerance to uset to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5

def base_cyl(nome, rad, alt):
    obj1 = DOC.addObject("Part::Cylinder", nome)
    obj1.Angle = 180
    obj1.Radius = rad
    obj1.Height = alt
    DOC.recompute()

    return obj1

cyl = base_cyl("int_cyl", 10, 20)
cyl.Placement = FreeCAD.Placement(Vector(0, 0, EPS_C), Base.Rotation(Vector(0, 0, 0), 0))
zero_plane(100,100)
DOC.recompute()

FreeCAD.Gui.SendMsgToActiveView("ViewFit")
FreeCAD.Gui.activeDocument().activeView().viewAxometric()

Il cambiamento sembra di poco conto, però permette di riusare il codice in modo da avere un oggetto diverso ad ogni chiamata.

Per mostrare questo complichiamo veramente le cose, pensiamo di voler posizionare gli oggetti in un certo modo, fonderli e sottrarre delle cose, ad esempio per creare una puleggia.

EPS_C = EPS * -0.5

def base_cyl(nome, rad, alt, angle):
    obj1 = DOC.addObject("Part::Cylinder", nome)
    obj1.Angle = angle
    obj1.Radius = rad
    obj1.Height = alt
    DOC.recompute()

    return obj1

def fori_allegg(nome, n_fori, offset, v_dia, tot_h, off_z):
    ang_dist = pi / n_fori
    center = Vector(0,0,0)    

    compound =[]

    for n_s in range(0, n_fori):
        vpx = offset * cos((2 * ang_dist * n_s)) + center[0]
        vpy = offset * sin((2 * ang_dist * n_s)) + center[1]
        
        nome_ob = nome + "_" + str(n_s)
        obj = base_cyl(nome_ob, v_dia, tot_h, 360)
        obj.Placement = FreeCAD.Placement(Vector(vpx, vpy , off_z), Base.Rotation(Vector(0, 0, 0), 0))
        
        compound.append(obj)

    obj_cmp = DOC.addObject("Part::Compound", "fori_allegg")
    obj_cmp.Links = compound

    DOC.recompute()

    return obj_cmp

def supp_forato(nome):
    
    cyl = base_cyl("base_cyl", 100, 20, 360)
    fori = fori_allegg("fori_allegg", 7, 50, 15, 20 + EPS, EPS_C)

    obj_r = DOC.addObject("Part::Cut", nome)
    obj_r.Base = cyl
    obj_r.Tool = fori
    obj_r.Refine = True
    obj_r.Placement = FreeCAD.Placement(Vector(0, 0, 0), Base.Rotation(Vector(0, 0, 0), 0))

    DOC.recompute()


zero_plane(100,100)
supp_forato("supporto")

DOC.recompute()

FreeCAD.Gui.SendMsgToActiveView("ViewFit")
FreeCAD.Gui.activeDocument().activeView().viewAxometric()

Abbiamo creato un oggetto, un cilindro con dei fori di alleggerimento, per creare la puleggia manca il foro centrale e la gola esterna, ma comunque la formadi base c'è.

Notate che abbiamo usato una definizione di cilindro unica, in modo da evitare di ripetere tutte le righe di codice e rendere più compatto e meno soggetto ad errori il codice.

def base_cyl(nome, rad, alt, angle):
    obj1 = DOC.addObject("Part::Cylinder", nome)
    obj1.Angle = angle
    obj1.Radius = rad
    obj1.Height = alt
    DOC.recompute()

    return obj1

Questa definizione l'abbiamo riutilizzate tutte le volte che ci serviva un cilindro sia per il corpo principale della puleggia, sia per i fori di alleggerimento.

def fori_allegg(nome, n_fori, offset, v_dia, tot_h, off_z):
    ang_dist = pi / n_fori
    center = Vector(0,0,0)    

    compound =[]

    for n_s in range(0, n_fori):
        vpx = offset * cos((2 * ang_dist * n_s)) + center[0]
        vpy = offset * sin((2 * ang_dist * n_s)) + center[1]
        
        nome_ob = nome + "_" + str(n_s)
        obj = base_cyl(nome_ob, v_dia, tot_h, 360)
        obj.Placement = FreeCAD.Placement(Vector(vpx, vpy , off_z), Base.Rotation(Vector(0, 0, 0), 0))
        
        compound.append(obj)

    obj_cmp = DOC.addObject("Part::Compound", "fori_allegg")
    obj_cmp.Links = compound

    DOC.recompute()

    return obj_cmp

Nel codice notiamo alcune cose:

1) L'utilizzo della potenza di Python e di FreeCAD per dare un nome significativo ad ogni oggetto, usando ad esempio la composizione del nome di ogni foro aggiungendoli il numero d'ordine di creazione.

2) L'utilizzo delle funzioni matematiche usuali di python per posizionare gli oggetti usando la formula per determinare i vertici di un poligono.

alcune cose sono proprie però del modellatore di FreeCAD:

1) l'utilizzo della funzione Compound che permette di creare una serie di oggetti che non si intersecano e usarli come un solo oggetto.

    obj_cmp = DOC.addObject("Part::Compound", "fori_allegg")
    obj_cmp.Links = compound

    DOC.recompute()

Gli oggetti sono creati e aggiunti ad una lista di oggetti: compound = [] si occupa di inizializzare la lista (o array unidimensionale come viene chiamata in altri linguaggi)
e gli oggetti sono aggiunti con un compound.append() ad essa.

    for n_s in range(0, n_fori):
        vpx = offset * cos((2 * ang_dist * n_s)) + center[0]
        vpy = offset * sin((2 * ang_dist * n_s)) + center[1]
        
        nome_ob = nome + "_" + str(n_s)
        obj = base_cyl(nome_ob, v_dia, tot_h, 360)
        obj.Placement = FreeCAD.Placement(Vector(vpx, vpy , off_z), Base.Rotation(Vector(0, 0, 0), 0))
        
        compound.append(obj)

2) La funzione Cut che permette di sottrarre un oggetto da un altro.


    obj_r = DOC.addObject("Part::Cut", nome)
    obj_r.Base = cyl
    obj_r.Tool = fori
    obj_r.Refine = True
    obj_r.Placement = FreeCAD.Placement(Vector(0, 0, 0), Base.Rotation(Vector(0, 0, 0), 0))

Dato che cut in FreeCAD non gestisce oggetti multipli, usare la funzione compuond, ci semplifica molto la vita.


Per creare oggetti complessi ci manca sostanzialmente una operazione booleana, l'Unione.

Abbiamo due metodi uno semplice che è il corrispondente della funzione cut

myfus =  DOC.addObject("Part::Fuse", "fusione")
myfus.Base = mybox
myfus.Tool = mybox_2

notare la definizione delle proprietà Base e Tool analoghe a quelle della funzione Cut

e uno più complesso che unisce molti oggetti con alcuni punti in comune con la funzione compound

    obj_bf = DOC.addObject("Part::MultiFuse", "supp testa_base")
    obj_bf.Shapes = [ext_ring, int_ring, snodo]
    obj_bf.Refine = True
    obj_bf.Placement = FreeCAD.Placement(Vector(0, 0, 0), Base.Rotation(Vector(0, 0, 0), 0))

notate che alla proprietà Shapes viene assegnata una lista identificabile dal fatto che è racchiusa tra parentesi quadre, niente ci vieta di assegnare semplicemente il nome di un oggetto lista a Shapes

3) Le operazioni boleane in genere supportano la proprietà Refine che se messa a True cerca di eliminare le facce nascoste e le giunture in modo da ottenere un oggetto con meno facce.

Ovviamente dovete sapere che moltissimi modellatori 3D usano il concetto di facce che in genere sono tringoli e l'unione di questi triangoli crea una rete (mesh) che costituisce l'oggetto 3D.

Già da ora potete maneggiare la creazione di oggetti, manca la parte più importante, come creare l'oggetto STL

Se fate girare il programma in FreeCAD ottenete la lista di oggetti sulla sinistra, se cliccate su un oggetto lo evidenziate, quando lo avete evidenziato, se usate la barra spaziatrice, potete modificare al volo la visibilità dell'oggetto.

Se cliccate sulla freccetta a sinistra dell'oggetto, vedrete i componenti dell'oggetto e così via per tutto "l'albero", ogni oggetto può essere reso visibile o meno usando la barra spaziatrice come interruttore.

Ad esempio per controllare i "fori_alleg", selezionateli e premete la barra e vedrete che i buchi si riempiono degli oggetti, se fate lo stesso sull'oggetto principale "supporto" che è visibile, l'oggetto diventa invisibile e vedrete solo i buchi come oggetti separati, se nascondete i buchi, selzionate "base_cyl" e premete la barra vedrete il cilindro base dell'oggetto.

Questo sarà l'oggetto della prossima puntata.

Salutoni

Carlo D.

Edited 2 time(s). Last edit at 02/09/2020 11:23AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
February 10, 2020 07:03AM
Bentrovati, vedo che le letture incrementano, nessun commento però.

Adesso veniamo al punto topico (non è un roditore).

come fare per trasformare il nostro solido in un file STL.

Beh ci sono due modi:

Primo modo: scegliere esporta nel menu file con il solido selezionato e esportarlo come file STL, FreeCAD farà il resto, però dovete fare un giro barbino per vedere le opzioni di esportazione.

dovete attivare il Workbench Mesh designer e solo dopo averlo attivato nel menù Modifica > Preferenze al Tab Importa/Esporta trovate come ultima "linguetta" formati mesh dove potete selezionare solo due cose
1) la deviazione della maglia dal modello, più piccola è più precisa diventa di default dovrebbe essere 0,100 mm
2) l'esportazione nel formato AMF con compressione (non spuntatela se volete poi importare un file AMF ad esempio in Slic3R)

Secondo modo: usare lo scripting:

def create_mesh(o_name):
    """
    Create the mesh object
    """
    mesh = DOC.addObject("Mesh::Feature", "Mesh")
    mesh.Mesh = MeshPart.meshFromShape(
        Shape=DOC.getObject(o_name).Shape,
        LinearDeflection=0.01,
        AngularDeflection=0.025,
        Relative=False)
    mesh.Label = "Mesh_" + o_name
    mesh.ViewObject.CreaseAngle = 25.0

    filename = u"/Model_" + o_name + ".amf"
    __objs__ = []
    __objs__.append(mesh)

    Mesh.export(__objs__, filename, tolerance=0.01, exportAmfCompressed=False)

In soldoni dovete fornire a questo metodo che ho creato per rendere le cose più semplici, solo il nome dell'oggetto.

La riga

        Shape=DOC.getObject(o_name).Shape

si occuperà di trovarlo nella lista degli oggetti di FreeCAD.

Per farlo funzionare dovete però fare due cose:

aggiungere all'inizio del file:

import Mesh
import MeshPart

modificare la parte:

    filename = u"/Model_" + o_name + ".amf"

in modo da aggiungerci un percorso decente ad esempio u"/home/pippo/Model_" al posto di quello che ci ho messo io u"/Model_"

e modificare il suffisso in modo da scegliere se salvare in AMF (.amf) come nell'esempio oppure in STL (.stl)


Nella riga

Mesh.export(__objs__, filename, tolerance=0.01, exportAmfCompressed=False)

potete modificare il valore tolerance come più vi aggrada le due opzioni oltre al nome del file sono i due parametri modificabili nella linguetta delle preferenze.

Questi due parametri

LinearDeflection=0.01,
AngularDeflection=0.025,


Vi permettono di decidere come viene effettivamente resa la Mesh cioè la parte che più ci interessa,

LinearDeflection regola la precisione delle "linee rette" mentre AngularDeflection controlla la resa delle "curve" del modello.

i due valori scelti sono quelli che offrono un buon compromesso tra precisione del modello e velocità di calcolo della Mesh e quindi in definitiva la velcità di esportazione, se scendete troppo aspettatevi attese lunghe.


Salutoni

Carlo D.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
February 11, 2020 06:53AM
Oggi parliamo della rotazione, la bestia nera che si incontra ogni volta che si usa un modellatore 3D e non si ha una solida base matematica.

Dopo molto tempo ho trovato un modo elegante e abbastanza comprensibile per usare la rotazione e la traslazione in FreeCAD.

Almeno nella versione 0.18 (la ultima stabile) questo funziona decentemente ed è capibile anche da chi come me non è un ingegnere.

Trovate il file come allegato.

In soldoni avete una serie di funzioni che aiutano a ruotare un oggetto e una serie di assi che vi aiutano a capire come "girano le cose", semplice semplice, tanto per capire il meccanismo.

L'oggetto scelto come "cubo di prova", non è cubo ma un rettangolo con un piolo che esce dal centro nella parte superiore, comodo comodo per capire le rotazioni, mancherebbe una punta però ne possiamo fare a meno per il momento.

La parte del codice con cui giocare è:

obj = test_cube()

rpy_rot(obj, 100, 100, 50, 0, 0, 0, True, 30)

Il "trucco" è la costruzione del "cubo" in quanto un oggetto Box in FreeCAD ha come punto di riferimento lo spigolo in xmin, ymin, zmin come ben spiegato verso la fine di Questa Pagina della documentazione

Il "cubo" va quindi costruito come se fosse centrato sull'origine (cioè il suo centro è a X = 0, Y =0, Z =0), per una cosa rettangolare in pratica questo equivale a mettere gli opportuni valori nella proprietà Placement come potete vedere in questa porzione del codice di costruzione del "cubo"

def cube(l,w,h):
    obj_b = DOC.addObject("Part::Box", "base_cube")
    obj_b.Length = l
    obj_b.Width = w
    obj_b.Height = h
    obj_b.Placement = FreeCAD.Placement(Vector(l * -0.5, w * -0.5, h * -0.5), FreeCAD.Rotation(Vector(0,0,0), 0))

il "cubo" è ora centrato sul suo "centro" (scusate il gioco di parole) che diventa così il "centro di rotazione"

Primo problema la proprietà Placement può esere modificata da successive trasformazioni, però una cosa da notare è che se l'oggetto viene modificato con una operazione booleana, il nuovo oggetto creato avrà una "sua propria" porprietà Placement, da qui il trucco di aggiungere qualcosa all'oggetto principale, in modo che l'oggetto risultante abbia la proprietà Placement a (0,0,0) sul suo "centro di rotazione".

Fatto questo potete tranquillamente translare e ruotare tutto come più desiderate, se usate la funzione che vi propongo:

def rpy_rot(obj, tx, ty, tz, rx, ry, rz, axis, l_ind ):

diventa semplice inserire in tx, ty, tz il nuovo punto di destinazione del "centro di rotazione dell'oggetto" e in rx, ry, rz le rotazioni relative agli "assi locali" che passano per il "centro di rotazione" dell'oggetto.

se stampate la proprietà placement dopo aver modificato le righe in questo modo:

rpy_rot(obj, 100, 100, 50, 45, 0, 0, True, 30)

print(obj.Placement)

notate che il 45 ve lo ritrovate alla fine,
Placement [Pos=(100,100,50), Yaw-Pitch-Roll=(0,0,45)]


La Rotazione attorno X corrisponde al roll come spiegato nella pagina già citata.


Yaw = 10 degrees (Z)

Pitch = 20 degrees (Y)

Roll = 30 degrees (X)

Questo vuol dire che se modificate la proprietà Placement l'oggetto si sposterà.

Saluti

Carlo D.

Edited 1 time(s). Last edit at 02/11/2020 06:58AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Attachments:
open | download - forum_ex3.py (6.1 KB)
Re: Creare modelli in FreeCAD
February 19, 2020 01:11PM
Bentrovati, nel caso a qualcuno interessasse questa serie di post, gradirei saperlo, anche per migliorare l'esposizione, nel frattempo sto comunque realizzando una guida in PDF relativamente completa.

Saluti

Carlo D.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
February 28, 2020 02:33PM
Prima bozza pubblicata su GitHub


Prima bozza su GitHub


Saluti

Carlo D.

Edited 2 time(s). Last edit at 02/29/2020 05:00AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
March 04, 2020 04:58AM
Due news:

  1. Ho aggiornato la pagin Github ed ora contiene la bozza completa della guida
  2. Ho creato una pagina sul wiki di FreeCAD che sppiega velocemente le cose, però ovviamente è per chi riesce già ad orientarsi in FreeCAD, riporto sotto l'indirizzo.


Scripts su wiki FreeCAD


Saluti

Carlo D.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
March 12, 2020 04:59AM
Altre News:

  • Nuova versione v0.20 della pdf
  • Il pdf è cliccabile con i riferimenti incrociati, quando passate su un link ad esempio "la figura ..." esce un riquadro giallo e cliccandolo si passa al punto corrispondente, stessa con succede con gli indici prima del testo.
  • I listati sono aggiornati, le modifiche sono minime, ma qualche volta sono significative

riporto il link:

https://github.com/onekk/freecad-doc

Saluti

Carlo D.

Edited 1 time(s). Last edit at 03/12/2020 05:01AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Creare modelli in FreeCAD
May 11, 2020 12:01PM
Buongiorno,

ho continuato a sperimentare e la mia attività nel forum di FreeCAD mi ha portato a migliorare alcune conoscenze, alcune convinzioni che avevo si sono rivelate imprecise, altre hanno auvto conferma, vi presento questa nuova versione, FreeCAD è decisamente il miglior modo per creare ogggetti 3D.

Nuova versione della guida, riveduta e corretta:

- migliorie nella spiegazione
- aggiunta di una parte teorica
- modifiche nei listati
- alcune avvertenze nel testo

riporto il link:
Nuova versione 0.30

Saluti

Carlo D.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Sorry, only registered users may post in this forum.

Click here to login