Ambiente A2plus

From FreeCAD Documentation
Jump to navigation Jump to search
This page is a translated version of the page A2plus Workbench and the translation is 76% complete.
Other languages:
Deutsch • ‎English • ‎français • ‎italiano • ‎русский • ‎中文(简体)‎
L'icona di A2plus

Introduzione

A2plus è un ambiente complementare per assemblare varie parti in FreeCAD.

Questa documentazione descrive la versione A2plus 0.4.47 o più recente.

Installazione

L'ambiente A2plus è un componente aggiuntivo di FreeCAD. Può essere facilmente installato tramite il menu Strumenti → Addon Manager. A2plus è in sviluppo attivo e riceve frequentemente nuove funzioni. Pertanto si dovrebbe aggiornarlo regolarmente usando sempre il menu Strumenti → Addon Manager. Il codice A2plus è ospitato e sviluppato in su GitHub e può anche essere installato manualmente copiandolo nella directory MOD di FreeCAD.

Per iniziare

Passare sulla barra degli strumenti di A2plus in FreeCAD. Per creare un assieme, creare un nuovo file. All'inizio questo file deve essere salvato. Si consiglia (ma non è necessario) di salvarlo nella stessa cartella delle parti che si desidera assemblare.

Ora è possibile aggiungere parti all'assieme utilizzando il pulsante A2p ImportPart.svg della barra degli strumenti o A2p ShapeReference.svg. Il pulsante A2p ImportPart.svg aggiunge tutti i corpi nel file selezionato come una singola parte. Quando si usa il pulsante A2p ShapeReference.svg si può scegliere quale parte di un file deve essere importato come parte. In questo modo si può ad esempio importare solo uno schizzo per assemblare ulteriori parti usando lo schizzo per determinare le posizioni delle parti.

La prima parte aggiunta ottiene una posizione fissa per impostazione predefinita. (in seguito è possibile modificare questo tramite la proprietà della parte Datafixed Position.)

Le parti già presenti nell'assieme possono essere clonate con il pulsante A2p DuplicatePart.svg della barra degli strumenti.

Per modificare una parte dall'assieme, selezionarla nell'albero del modello e utilizzare il pulsante della barra degli strumenti A2p EditPart.svg. Questo apre la parte in una nuova scheda in FreeCAD o passa alla sua scheda se il file è già aperto.

Per aggiornare le parti modificate negli assemblaggi fare clic sul pulsante A2p ImportPart Update.svg della barra degli strumenti. Il pulsante A2p RecursiveUpdate.svg della barra degli strumenti importa anch'esso le parti ma ricorsivamente su possibili sottoassiemi. Se si selezionano una o più parti nella vista ad albero di FreeCAD, A2plus chiederà se aggiornare solo le parti selezionate.

Le parti importate mantengono le loro dipendenze esterne e possono essere modificate. Per parti ben definite, come le viti, è comunque utile che la loro forma non possa essere modificata. Questo può essere ottenuto con il pulsante della barra degli strumenti A2p ConvertPart.svg che converte la parte selezionata in una copia statica della parte originale.

Per salvare l'assemblaggio e in seguito chiuderlo, è possibile utilizzare il pulsante A2p Save and exit.svg della barra degli strumenti.

Assemblaggio

L'assemblaggio delle parti viene effettuato aggiungendo dei vincoli tra le parti. Dopo l'applicazione di un vincolo, A2plus sposta le parti in base al vincolo, se possibile.

Per creare un vincolo tra le parti, tenere premuto il tasto Ctrl e selezionare un bordo o una faccia di due parti. Quindi cliccare il bottone del vincolo desiderato nella barra degli strumenti. Apparirà la finestra di dialogo descritta nella sezione Vincoli. Il vincolo viene aggiunto nell'albero del modello allegato alle parti interessate.

Per i vincoli complessi tra le parti A2plus potrebbe non riuscire a risolvere i vincoli. Pertanto, dare un'occhiata anche alla sezione Risoluzione dei problemi per le strategie su come risolvere tali casi.

Tenere traccia

Più parti si aggiungono, più è importante mantenere la traccia. A2plus offre quindi questi strumenti per spostare e visualizzare le parti:

  • Per spostare una parte nell'assieme, selezionarla nell'albero del modello e utilizzare il pulsante A2p MovePart.svg. Quando la parte è posizionato dove si desidera, fare clic con il tasto sinistro del mouse. Se la parte spostata ha già dei vincoli, la parte viene posizionata di conseguenza premendo il pulsante A2p solver.svg perché questo innesca la risoluzione di tutti i vincoli dell'assieme.
  • Per mostrare un vincolo selezionarlo nell'albero del modello e utilizzare il pulsante A2p ViewConnection.svg. Ciò rende l'intero assemblaggio trasparente e evidenzia i due elementi che sono connessi nel vincolo. Per tornare alla visualizzazione normale, fare clic con il tasto sinistro sull'assieme.
  • Per mostrare solo alcune parti nell'assieme, selezionare queste parti nell'albero del modello e utilizzare il pulsante A2p Isolate Element.svg. In alternativa si può nascondere una certa parte selezionandola nell'albero del modello e premendo Spazio per commutare la sua visibilità.
  • Per attivare la vista trasparenza dell'intero assieme, si può utilizzare il pulsante A2p ToggleTransparency.svg.
  • Ogni parte può essere resa trasparente utilizzando la normale modalità di FreeCAD. Tuttavia a volte l'impostazione della trasparenza per le parti viene persa quando si riapre l'assieme a causa di un bug in FreeCAD. Per risolvere il problema, si può utilizzare il pulsante A2p Restore Transparency.svg della barra degli strumenti per ripristinare le impostazioni di trasparenza.

Vincoli

Quando si crea un vincolo, dopo aver premuto un pulsante della barra degli strumenti dei vincoli, viene visualizzata questa finestra di dialogo:

A2p ConstraintPropertiesDialog.png

Sopra: la finestra di dialogo Proprietà del vincolo di A2plus


Per alcuni vincoli, consente di modificare la direzione del vincolo. Con il pulsante A2p solver.svg Solve si può verificare in anteprima se questo nuovo vincolo può essere risolto con A2plus. In caso contrario, dare un'occhiata alla sezione Risoluzione dei problemi.

I vincoli possono essere disabilitati cambiando la loro visibilità. Questo si ottiene selezionando il vincolo nella vista ad albero e premendo Space. Ciò attiva la proprietà DataSuppressed. Un vincolo soppresso non è preso in considerazione quando l'assemblaggio viene risolto.

A2plus fornisce i seguenti vincoli:

Punto su punto

Selezionare un vertice (punto) su ciascuna parte. Il pulsante della barra degli strumenti A2p PointIdentity.svg aggiunge il vincolo pointIdentity. Rende i vertici coincidenti.

Punto sul linea

Selezionare un vertice (punto), o bordo circolare (seleziona il suo punto centrale), o una faccia sferica (seleziona anche il suo punto centrale) su una parte e un bordo sull'altra parte. Il pulsante A2p PointOnLineConstraint.svg della barra degli strumenti aggiunge il vincolo pointOnLine. Posiziona il vertice sul bordo.

Punto su piano

Selezionare un vertice (punto), o bordo circolare (seleziona il suo punto centrale), o una faccia sferica (seleziona anche il suo punto centrale) su una parte e un piano sull'altra parte. Il pulsante A2p PointOnPlaneConstraint.svg aggiunge il vincolo pointOnPlane. La finestra di dialogo dei vincoli consente di specificare uno scostamento tra il punto e il piano. Questo offset può anche essere capovolto su entrambi i lati del piano. Se l'offset è zero, il vincolo posiziona il punto sul piano.

Sfera su sfera

Selezionare una faccia sferica o una vertice (punto) su entrambe le parti. Il pulsante A2p SphericalSurfaceConstraint.svg aggiunge il vincolo sphereCenterIdent. Rende il centro delle sfere, o il centro della sfera e il vertice, o i vertici coincidenti.

Bordo circolare sul bordo circolare

Selezionare un bordo circolare su entrambe le parti. Il pulsante A2p CircularEdgeConstraint.svg aggiunge il vincolo circularEdge. La finestra di dialogo dei vincoli consente di specificare un offset tra i bordi. Questo offset può anche essere invertito. È inoltre possibile impostare la direzione del vincolo e bloccare la rotazione delle parti. Se l'offset è zero, il vincolo posiziona i bordi concentrici sullo stesso piano.

Asse coincidente

Selezionare una faccia cilindrica o un bordo lineare su entrambe le parti. Il pulsante A2p AxialConstraint.svg aggiunge il vincolo axisCoincident. La finestra di dialogo dei vincoli consente di specificare la direzione dell'asse. La finestra di dialogo consente inoltre di bloccare la rotazione delle parti. Il vincolo rende coincidenti gli assi o le linee.

Asse parallelo

Selezionare una faccia cilindrica o un bordo lineare su entrambe le parti. Il pulsante A2p AxisParallelConstraint.svg aggiunge il vincolo axisParallel. La finestra di dialogo dei vincoli consente di specificare la direzione dell'asse. Il vincolo rende paralleli gli assi o le linee.

Asse su piano parallelo

Selezionare una faccia cilindrica o un bordo lineare su una parte e un piano sull'altra parte. Il pulsante A2p AxisPlaneParallelConstraint.svg aggiunge il vincolo axisPlaneParallel. Il vincolo rende l'asse o la linea paralleli al piano.

Asse su piano normale

Selezionare una faccia cilindrica o un bordo lineare su una parte e un piano sull'altra parte. Il pulsante A2p AxisPlaneNormalConstraint.svg aggiunge il vincolo axisPlaneNormal. Il vincolo rende l'asse o la linea normale rispetto al piano.

Asse su angolo piano

Selezionare una faccia cilindrica o un bordo lineare su una parte e un piano sull'altra parte. Il pulsante A2p AxisPlaneAngleConstraint.svg aggiunge il vincolo axisPlaneAngle. Il vincolo rende innanzitutto l'asse parallelo al piano. Poi si può aggiustare l'angolo dell'asse nelle impostazioni di vincolo della finestra di dialogo che appare.

Piano parallelo

Selezionare un piano su entrambe le parti. Il pulsante della barra degli strumenti A2p PlanesParallelConstraint.svg aggiunge il vincolo planesParallel. La finestra di dialogo dei vincoli consente di specificare la direzione del vincolo. Il vincolo rende paralleli i piani.

Piano su piano

Selezionare un piano su entrambe le parti. Il pulsante della barra degli strumenti A2p PlaneCoincidentConstraint.svg aggiunge il vincolo planeCoincident. La finestra di dialogo dei vincoli consente di specificare una direzione del vincolo e un offset tra i piani. Questo offset può anche essere capovolto. Se l'offset è zero, il vincolo rende i piani coincidenti.

Angolo tra i piani

Selezionare un piano su entrambe le parti. Il pulsante A2p AngleConstraint.svg aggiunge il vincolo angledPlanes. La finestra di dialogo dei vincoli consente di specificare un angolo tra i piani. Il vincolo rende i piani paralleli e imposta l'angolo specificato.

Coincidenza al centro di massa

Selezionare un bordo chiuso o un piano su entrambe le parti. Il pulsante A2p CenterOfMassConstraint.svg aggiunge il vincolo centerOfMass. La finestra di dialogo dei vincoli consente di specificare un offset tra i bordi o i piani. Questo offset può anche essere capovolto. È inoltre possibile impostare la direzione del vincolo e bloccare la rotazione delle parti. Se l'offset è zero, il vincolo mette i bordi o i piani nello stesso piano.

Sottoassiemi

Un assieme può contenere altri assiemi. Vengono aggiunti come parti premendo il pulsante A2p ImportPart.svg della barra degli strumenti e selezionando un file *.FCStd contenente un assemblaggio. Tali sottoassiemi possono anche essere modificati come parti utilizzando il pulsante A2p EditPart.svg. Per fasi di assemblaggio più elevate, e in caso di modifiche, accertarsi di aggiornare l'assieme tramite il pulsante A2p ImportPart Update.svg.

Gestione dei vincoli

I vincoli che possono essere selezionati vengono visualizzati nella barra degli strumenti e nella finestra di dialogo Constraint Tools attivando i pulsanti corrispondenti. La finestra di dialogo Constraint Tools si apre tramite il pulsante A2p DefineConstraints.svg. È previsto che rimanga aperto per poter aggiungere rapidamente diversi vincoli all'assieme.

I vincoli esistenti possono essere modificati selezionandoli nell'albero del modello e quindi facendo doppio clic su di essi o utilizzando il pulsante della A2p EditConstraint.svg. Questo apre la finestra di dialogo Constraint Properties.

I vincoli possono essere soppressi temporaneamente selezionandoli nell'albero del modello e cambiando la proprietà DataSuppressed dell'elemento dell'albero.

È possibile eliminare i vincoli selezionandoli nell'albero del modello e premendo Canc o selezionando una parte con i vincoli nell'albero del modello e utilizzando il pulsante A2p DeleteConnections.svg.

Tutti i vincoli possono essere risolti in qualsiasi momento con il pulsante A2p solver.svg. Se il pulsante della barra degli strumenti A2p ToggleAutoSolve.svg è attivato, viene eseguita automaticamente una risoluzione dopo ogni modifica di un vincolo.

Il pulsante A2p FlipConstraint.svg ha effetto sull'ultimo vincolo aggiunto. Capovolge la direzione del vincolo.

Elenchi delle parti

Per creare degli elenchi di parti di assiemi, le diverse parti dell'assieme devono ottenere informazioni sulla parte che possano essere lette da A2plus. Questo viene fatto modificando la parte con il pulsante A2p EditPart.svg. Nella parte aperta premere il pulsante A2p PartsInfo.svg per creare un foglio di calcolo con il nome #PARTINFO#.

La struttura del foglio di calcolo è come questa:

A2p PartinfoTable.png

Compilare i campi grigi con le informazioni che si hanno e che si vuole avere nella lista delle parti finali.

Nell'assemblaggio o nel sottoassieme, utilizzare il pulsante A2p PartsList.svg. Viene chiesto se si vuole fare una iterazione ricorsiva su tutti i sottoassiemi. Cliccare su "Sì". Questo crea un nuovo foglio di calcolo con il nome #PARTSLIST# . Contiene le informazioni dei diversi fogli di calcolo "#PARTSINFO#" delle parti in una lista come questa:

A2p PartslistTable.png

La posizione (POS) viene automaticamente impostata in base alla posizione delle parti nell'albero del modello. La parte di livello superiore ottiene POS 1.

La quantità (QTY) viene calcolata automaticamente dall'assieme. Se una parte è presente due volte nell'assieme, ottiene QTY 2.

Se si sono aggiornate delle informazioni sulla parte, è possibile aggiornare di nuovo l'elenco delle parti premendo nuovamente il pulsante A2p PartsList.svg.

Per i sottoassiemi è anche possibile creare un foglio di calcolo delle informazioni utilizzando il pulsante A2p PartsInfo.svg. Quando si crea o si aggiorna l'elenco delle parti dell'assieme principale, queste informazioni vengono utilizzate se si clicca su "No" alla domanda se si desidera ripetere l'iterazione ricorsiva su tutti i sottoassiemi. Quindi le diverse parti non sono nell'elenco delle parti ma solo nei sottoassiemi.

Funzioni speciali

Struttura dell'assemblaggio

Il pulsante A2p Treeview.svg crea un file HTML con la struttura dell'assieme. Per impostazione predefinita il file viene creato nella cartella del file dell'assemblaggio. La struttura assomiglia a questa: A2p Dependency-Tree.jpg

Gradi di libertà

Il pulsante A2p DOFs.svg etichetta tutte le parti dell'assieme con i loro gradi di libertà. Inoltre genera una lista con tutte le parti e le loro dipendenze. L'elenco viene visualizzato nel widget di FreeCAD Vista Report. Se questo widget non è visibile, può essere mostrato facendo clic con il pulsante destro del mouse su una parte vuota dell'area della barra degli strumenti di FreeCAD e quindi selezionandolo nel menu di scelta rapida visualizzato o con il menu Visualizza → Pannelli → Vista report.

Le etichette dei gradi di libertà possono essere rimosse facendo nuovamente clic sul pulsante A2p DOFs.svg.

Etichette delle parti

Il pulsante A2p PartLabel.svg contrassegna nella vista 3D ogni parte dell'assieme con il proprio nome. Le etichette delle parti possono essere rimosse facendo nuovamente clic sul pulsante A2p PartLabel.svg.

Forma dell'intero assemblaggio

A volte è necessario avere l'intero assemblaggio combinato in una unica forma. Questa forma può quindi essere utilizzata ad esempio per la stampa 3D nell'ambiente Mesh o per i disegni nell'ambiente TechDraw. Viene creata utilizzando il pulsante della barra degli strumenti A2p SimpleAssemblyShape.svg. Di default la forma non è visibile. Utilizzare lo stesso pulsante della barra degli strumenti per aggiornare la forma in caso di modifiche all'assieme.

Convertire i percorsi assoluti in relativi

Con il menu A2plus → Misc → A2p SetRelativePathes.svg Convert absolute paths of imported parts to relative ones si possono convertire i percorsi assoluti delle parti importate in quelli relativi.

Preferenze

Le preferenze di A2plus sono accessibili tramite il menu di FreeCAD Modifica → Preferenze, nella sezione A2plus. È possibile impostare le seguenti opzioni:

Metodo di risoluzione predefinito

Use solving of partial systems 
Il risolutore inizia con una parte che ha la proprietà Datafixed Position impostata su "true" e una parte vincolata ad essa. Tutte le altre parti non sono calcolate. Se è possibile trovare una soluzione, la successiva parte vincolata viene aggiunta e calcolata e così via.
Use "magnetic" solver, solving all parts at once 
Il risolutore cerca di spostare tutte le parti contemporaneamente in direzione di una parte che ha la proprietà Datafixed Position impostata su "true". Notare che nella maggior parte dei casi questo richiede più tempo per il calcolo di una soluzione.
Force fixed position 
Questo imposta per tutte le parti dell'assieme la proprietà Datafixed Position su true. Quindi non viene praticamente eseguito nessun calcolo poiché tutte le parti sono sempre fissate nelle posizioni in cui sono state create.

Comportamento predefinito del risolutore

Solve automatically if a constraint property is changed 
Il risolutore viene avviato automaticamente. Equivale ad attivare la funzione premendo il pulsante A2p ToggleAutoSolve.svg.

Comportamento durante l'aggiornamento delle parti importate

Recalculate imported parts before updating them 
Tutte le parti dell'assieme, compresi i sottoassiemi, vengono aperte in FreeCAD per essere ricostruite utilizzando i valori dei fogli di calcolo.
Questa funzione è progettata per vincolare in modo completamente parametrico. Nota: Questa funzione è molto sperimentale e non è consigliata per progetti importanti.
Problemi noti:
  • L'assemblaggio può essere distrutto a causa di riferimenti errati ai nomi topologici nelle parti.
  • I fogli di calcolo Master possono rompersi quando vengono modificati mentre un file di una parte di riferimento è già stato chiuso. Questo può causare un arresto anomalo di FreeCAD.
Enable recursive update of imported parts 
Apre tutti i sottoassiemi in modo ricorsivo per aggiornarli.
Use experimental topological naming 
Durante l'importazione di parti nell'assieme, un algoritmo genera dei nomi topologici per ciascun sottoelemento della forma importata. I nomi topologici sono scritti in Datamux Info. Quando è necessario aggiornare una parte importata, questi nomi topologici vengono utilizzati per aggiornare i sottoelementi dei vincoli. Quindi gli assemblaggi diventano più robusti rispetto ai numeri volatili dei sottoelementi di FreeCAD.
Nota: Questo aumenta però le dimensioni dei file e il tempo di calcolo durante l'importazione delle parti. Se è necessario utilizzare la denominazione topologica, bisogna attivarla prima di creare l'assemblaggio.
Inherit per face transparency from parts and subassemblies 
Usa le impostazioni di colore e la trasparenza delle parti importate.
Nota: Questa funzione è ancora molto sperimentale e non consigliata per progetti importanti.
Do not import invisible shapes 
Questo nasconde le forme di costruzione o di riferimento invisibili. Nota: Nessun vincolo deve essere collegato alle origini o agli oggetti di costruzione in sottoinsiemi o in insiemi superiori, altrimenti l'assemblaggio puoi rompersi.
Use solid union for importing parts and subassemblies 
Tutte le parti importate vengono create direttamente come unione.
Questa funzione è utile per le FEM o per la stampa 3D se è consentito un solo solido. L'alternativa è creare in seguito una Forma dell'intero assemblaggio.

Impostazioni dell'interfaccia utente

Show constraints in toolbar 
Per risparmiare spazio, se questa opzione non viene utilizzata, i pulsanti della barra degli strumenti per i diversi vincoli non sono visibili. È comunque possibile impostare dei nuovi vincoli utilizzando la finestra di dialogo Constraint Tools (il pulsante A2p DefineConstraints.svg) della barra degli strumenti.
Use native file manager of your OS 
Se questa opzione è usata, viene visualizzato la finestra di dialogo dei file del proprio sistema operativo quando si selezionano i file per gli assemblaggi.

Archiviazione dei file

Use relative paths for imported parts 
Utilizza i percorsi dei file relativi ai file delle parti.
Use absolute paths for imported parts 
Utilizza i percorsi di file assoluti per i file delle parti.
All files are in this project folder 
Tutti i file del progetto devono trovarsi nella cartella specificata. Non importa se si trovano in sottocartelle di questa cartella. Nota: Nessun file può esistere più volte nella cartella (ad esempio in diverse sottocartelle).
Questa opzione è utile per lavorare su macchine diverse perché in questo caso è sufficiente copiare la cartella del progetto.

Risoluzione dei problemi

Prima o poi si incontrano dei problema che A2plus non può risolvere i vincoli che sono stati imposti. Per superare questo, ci sono diverse strategie:

Utilizzo dello strumento di ricerca dei conflitti

Questo è il metodo più sicuro quando si hanno diversi vincoli perché questo strumento tenta di risolvere un vincolo dopo l'altro finché non trova il vincolo in conflitto. Quindi si può continuare utilizzando altre strategie per risolvere il vincolo identificato. Lo strumento viene richiamato utilizzando il pulsante A2p SearchConstraintConflicts.svg della barra degli strumenti.

Controllo della direzione dei vincoli

Talvolta i vincoli sembrano essere coerentemente definiti, tuttavia non possono essere risolti. Un esempio: si supponga di avere un set di vincoli planesParallel per due piani. Ora si vuole impostare per gli stessi piani il vincolo planeCoincident e A2plus non può risolverlo. Questo succede perchè le direzioni dei vincoli di planesParallel e di planeCoincident sono diverse. Utilizzare la stessa direzione per entrambi i vincoli per risolvere questo problema.

A2plus permette di controllare automaticamente la giusta direzione per tutti i vincoli dell'assieme utilizzando il pulsante A2p ReAdjustConstraints.svg della barra degli strumenti.

Eliminazione dei vincoli

La maggior parte dei casi di vincoli irrisolvibili si verifica direttamente quando si aggiunge un nuovo vincolo. La soluzione è quindi eliminare il vincolo aggiunto per ultimo. A2plus lo propone anche.

A volte la strategia di cancellazione dei vincoli è l'unica applicabile, ad esempio quando si modifica una parte in FreeCAD in modo che dopo mancano facce o spigoli collegati a vincoli. Si dovrebbe quindi eliminare uno dopo l'altro i vincoli che sono collegati alla parte modificata. Usare il pulsante della barra degli strumenti A2p solver.svg dopo ogni cancellazione per vedere se si è raggiunto uno stato risolvibile.

Quando si ottiene un assemblaggio che può essere risolto, aggiungere passo dopo passo i vincoli necessari.

Parti mobili

In alcuni casi, il risolutore necessita solo di valori di avvio migliori per risolvere i vincoli. Prendiamo ad esempio il caso che si abbia una parte asse e una parte ruota. Si aggiunge un vincolo axisCoincident e non si ottiene alcuna informazione che il risolutore abbia avuto esito negativo, ma le parti non vengono spostate di conseguenza e nel widget Vista Report di FreeCAD viene visualizzato "REACHED POS-ACCURACY :0.0". Una soluzione per questo è spostare le parti più vicino alla posizione che si desidera ottenere dal vincolo.

Nota: Assicurarsi che almeno una parte del vincolo abbia la proprietà Datafixed Position impostata su false.

Impostazione della proprietà Tip - Entità finale

Se dopo l'importazione in un assieme di A2plus mancano alcune funzioni della parte, controllare la proprietà DataTip - Entità finale.

A2plus importa i corpi delle parti con tutte le loro funzioni fino alla funzione finale, la funzione Tip. Questo è sensato perché impostare la funzione finale su una determinata funzione significa che tutte le funzioni sottostanti la funzione finale non dovrebbero apparire nell'entità finale. Quindi se in A2plus si perde una parte di funzioni, aprire la parte tramite il pulsante A2p EditPart.svg, selezionare un corpo e guardare la sua proprietà DataTip. Se l'entità finale non è nella funzione in cui la si desidera, fare clic con il pulsante destro del mouse sulla funzione in cui dovrebbe trovarsi e scegliere PartDesign MoveTip.png Set tip. Infine salvare la parte e ricaricare l'assieme usando il pulsante A2p ImportPart Update.svg.

Riparare l'albero dell'assieme

Se non si riesce a trovare una ragione chiara per cui alcuni vincoli non possono essere risolti, si può provare a utilizzare il pulsante A2p RepairTree.svg. Questo risolve tutti i vincoli e li raggruppa di nuovo sotto le diverse parti.

Migrare vecchi assemblaggi A2plus

Assemblaggi creati con versioni di A2plus precedenti marzo 2019 non mostrano le icone corrette per le parti importate e hanno propietà obsolete. Questi assemblaggi devono essere migrati ad A2plus versione 0.4.35 o superiore usando il menù A2plus → Misc → A2p Upgrade.svg Migrate proxies of imported parts. Dopo aver fatto ciò, si può salvare e riaprire il file d'assemblaggio.

Evitare i caratteri accentati

Questa strategia non è necessaria per Windows.

Su alcuni sistemi operativi si possono avere problemi se i nomi dei file o i percorsi dei file delle parti o dell'assieme contengono caratteri accentati. Quindi evitare tali caratteri e tutti i caratteri speciali in generale.

Posizione di fissaggio

Questa strategia non è più necessaria per gli assemblaggi creati con A2plus 0.3.11 o successivi perché ora A2plus presenta un avvertimento per le posizioni fisse mancanti.

Quando si imposta un vincolo tra due parti e nessuna parte ha la proprietà Datafixed Position impostata su true o è connessa da un vincolo a un'altra parte con Datafixed Position impostato su true, il vincolo non può essere risolto. Lo stesso accade se entrambe le parti del vincolo hanno Datafixed Position impostata su true.

In questi casi A2plus restituisce l'informazione che la soluzione non è possibile, ma a volte si vede solo che le parti non vengono spostate di conseguenza e nel widget Report di FreeCAD viene visualizzato "REACHED POS-ACCURACY :0.0". Ciò significa che il risolutore ha completato la risoluzione senza errori, ma che in realtà non è stato in grado di risolvere i vincoli.

Pertanto, verificare che almeno una delle parti nell'assieme abbia Datafixed Position impostata su "true". Quindi assicurarsi di impostare solo i vincoli su una parte che è in qualche modo collegata alla parte fissa. Per visualizzare queste dipendenze, vedere la sezione Struttura dell'assemblaggio.

Parti rotanti

Questa strategia non è più necessaria per gli assiemi creati con A2plus 0.4.0 o successivi perché ora A2plus ruota le parti automaticamente un po' in background per ottenere un angolo iniziale sufficiente per il risolutore.

Il risolutore spesso fallisce con il vincolo angledPlanes se i due piani selezionati hanno un angolo attuale di 0 ° o 180 °. (Le parti non vengono spostate di conseguenza e nel widget Report di FreeCAD si vede "REACHED POS-ACCURACY :0.0".) Una soluzione per questo è di ruotare una parte di alcuni gradi usando la funzione Trasforma di FreeCAD (fare clic con il tasto destro sulla parte nell'albero del modello e selezionare Transform nel menu di scelta rapida).

Nota: Assicurarsi che almeno una parte del vincolo abbia la proprietà Datafixed Position impostata su false.

Animazione

A2plus offre animazioni tramite trascinamento e tramite script Python.

Trascinamento

Dragging animations are interactive since you trigger it by dragging a part of the assembly. To get these kind of animations:

  1. Fully constrain the part whose movement or rotation should be animated
  2. Click on the toolbar button A2p MovePartUnderConstraints.svg. This enables the dragging mode.
  3. Click on the desired part in the assembly.
  4. Now you can move the mouse and the part will follow the movement of the mouse within the defined constraints.
  5. To end the dragging mode, left click in the assembly or press ESC.

Here is an example assembly to try out the dragging animation: A2p_example-for-dragging-animation.FCStd

A2p dragging-animation-result.gif

Above: The dragging animation using the example assembly


Scripting

Despite the dragging mode offers nice interactive animations, they are sometimes not precise enough for screencasts or videos. Scripted animations have the advantage that they animate movements and rotations in a defined way. You can for example rotate a part by exactly 10° back and forth. The following examples use an assembly where a part should be rotated. If you try to animate this using the dragging mode, you will see how hard it is to get a back and forth rotation that you can e.g. show your boss in a presentation. With the interactive example script, however, this is an easy task.

A scripted animation works usually this way:

  1. The assembly is fully constrained
  2. The script changes a parameter, for example the position or rotation angle of a part
  3. After the parameter change, the assembly constraints are solved
  4. Step 2. and 3. are repeated to get the animation

It is also possible to change instead of a placement parameter a constraint, for example the distance between 2 planes.

Simple Script Example

The simplest way to script an animation is a non-interactive animation that follows a defined movement. Here is an example: First download this assembly file: A2p_animated-example.FCStd and also this Python script: A2p_animation-example-script.py.

This is the content of the script and the lines beginning with a '#' describe what the different script lines do:

# import libraries
import time, math, PySide
import A2plus.a2p_solversystem as a2p_solver

# we use steps of 1 degree
step = 1
# wait 1 ms between every step
timeout = 0.001
# initial angle is 0 degree
angle = 0
# we take the currently opened document
document = FreeCAD.activeDocument()
# we want later change the rotation angle of the part "star_wheel_001"
starWheel = document.getObject("star_wheel_001")
# define a progress dialog running from 0 to 360
progressDialog = PySide.QtGui.QProgressDialog(u"Animation progress", u"Stop", 0, 360)

# the while block is the main loop to change the angle and solve
# the assembly constraints subsequently
while angle < 360: # run this loop until we have one full turn (360 degrees)
    # increase the rotation angle
    angle += step
    # set the new angle to the progress dialog
    progressDialog.setValue(angle)
    # change the rotation angle of the part "star_wheel_001"
    starWheel.Placement.Rotation.Angle = math.radians(angle)
    # solve the constraints 
    a2p_solver.solveConstraints(document, useTransaction=True)
    # update the view after the solving ('Gui' stands for 'graphical user interface')
    FreeCADGui.updateGui()
    # bring the progress dialog to front
    PySide.QtGui.QWidget.raise_(progressDialog)
    # if 'Stop' was pressed in the dialog, exit the loop
    if progressDialog.wasCanceled():
        angle = 360
    # wait some time before performing the next step
    time.sleep(timeout)

To use the script to perform the animation, we must

  1. Open the assembly file in FreeCAD.
  2. Open the script file in FreeCAD.
  3. Click on the toolbar button Menu Std DlgMacroExecute fr 02.png to execute the script (also called macro).
  4. Change to the tab of the assembly to see the rotation.

To practice, just change something in the script and execute it afterwards. For example increase step to 5.

This is the result of the example animation:

A2p animated-example-result.gif

Interactive Script Example

The first script example demonstrated how to create an animation without any user feedback. For most applications you need to interact with the animation. For example the interesting issue in the example is to see how the driving pins cross the center groove of the wheel. To have a closer look you might present this detail to your colleagues or boss. Therefore you need an interactive solution.

This can be done by using a custom animation dialog with a slider. By moving the slider you can set the rotation angle and therefore rotate back and forth at interesting position.

We use the same assembly file: A2p_animated-example.FCStd and this Python script: A2p_animation-example-script.py.

This is the content of the script to get the interactive animation dialog:

# import libraries
import time, math, PySide, sys
import FreeCAD.A2plus.a2p_solversystem as a2p_solver
from FreeCAD import Units
from PySide import QtCore, QtGui

# wait 1 ms after every calculation
timeout = 0.001
# we take the currently opened document
document = FreeCAD.activeDocument()
# we want later change the rotation angle of the part "star_wheel_001"
starWheel = document.getObject("star_wheel_001")

class AnimationDlg(QtGui.QWidget): # the animation dialog

    def __init__(self): # to initialize the dialog
        super(AnimationDlg, self).__init__()
        self.initUI()

    def initUI(self): # the definition of the dialog components
        self.setMinimumSize(self.minimumSizeHint()) # set the minimal dialog size to minimum
        self.setWindowTitle('Animation Dialog')
        # use a grid layout for the whole form
        self.mainLayout = QtGui.QGridLayout()
        self.lineNo = 0 # first dialog grid line
        # add description label
        DescriptionLabel = QtGui.QLabel(self)
        DescriptionLabel.setText("Change slider to change rotation angle")
        self.mainLayout.addWidget(DescriptionLabel,self.lineNo,0,1,4)
         # next dialog grid line
        self.lineNo += 1
        # add a label; there is no need for the "self." prefix because we don't want to change the label later
        LabelMin = QtGui.QLabel(self)
        LabelMin.setText("Min")
        LabelMin.setFixedHeight(32)
        self.mainLayout.addWidget(LabelMin,self.lineNo,0)
        # add a spin edit to define the slider minimum
        self.MinEdit = QtGui.QSpinBox(self)
        # get the angle unit as string
        self.MinEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
        self.MinEdit.setMaximum(999)
        self.MinEdit.setMinimum(0)
        self.MinEdit.setSingleStep(10)
        self.MinEdit.setValue(0)
        self.MinEdit.setFixedHeight(32)
        self.MinEdit.setToolTip("Minimal angle for the slider")
        QtCore.QObject.connect(self.MinEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMinEdit)
        self.mainLayout.addWidget(self.MinEdit,self.lineNo,1)
        # add the slider
        self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
        self.slider.setRange(0, 360)
        self.slider.setValue(0)
        self.slider.setFixedHeight(32)
        self.slider.setToolTip("Move the slider to change the rotation angle")
        QtCore.QObject.connect(self.slider, QtCore.SIGNAL("sliderMoved(int)"), self.handleSliderValue)
        self.mainLayout.addWidget(self.slider,self.lineNo,2)
        # add a label
        LabelMax = QtGui.QLabel(self)
        LabelMax.setText("Max")
        LabelMax.setFixedHeight(32)
        self.mainLayout.addWidget(LabelMax,self.lineNo,3)
        # add a spin edit to define the slider maximum
        self.MaxEdit = QtGui.QSpinBox(self)
        # get the angle unit as string
        self.MaxEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
        self.MaxEdit.setMaximum(999)
        self.MaxEdit.setMinimum(1)
        self.MaxEdit.setSingleStep(10)
        self.MaxEdit.setValue(360)
        self.MaxEdit.setFixedHeight(32)
        self.MaxEdit.setToolTip("Maximal angle for the slider")
        QtCore.QObject.connect(self.MaxEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMaxEdit)
        self.mainLayout.addWidget(self.MaxEdit,self.lineNo,4)
         # next dialog grid line
        self.lineNo += 1
        # add a spacer
        self.mainLayout.addItem(QtGui.QSpacerItem(10,10), 0, 0)
        # add a label
        LabelCurrent = QtGui.QLabel(self)
        LabelCurrent.setText("Current angle:")
        LabelCurrent.setFixedHeight(32)
        self.mainLayout.addWidget(LabelCurrent,self.lineNo,1)
        # output the current angle
        self.CurrentAngle = QtGui.QLineEdit(self)
        self.CurrentAngle.setText(str(0))
        self.CurrentAngle.setFixedHeight(32)
        self.CurrentAngle.setToolTip("Current rotation angle")
        self.CurrentAngle.isReadOnly()
        self.mainLayout.addWidget(self.CurrentAngle,self.lineNo,2)
        # add label for the unit
        LabelUnit = QtGui.QLabel(self)
        LabelUnit.setText("deg")
        LabelUnit.setFixedHeight(32)
        self.mainLayout.addWidget(LabelUnit,self.lineNo,3)
        # button to close the dialog
        self.Close = QtGui.QPushButton(self)
        self.Close.setText("Close")
        self.Close.setFixedHeight(32)
        self.Close.setToolTip("Closes the dialog")
        QtCore.QObject.connect(self.Close, QtCore.SIGNAL("clicked()"), self.CloseClicked)
        self.mainLayout.addWidget(self.Close,self.lineNo,4)
        # place the defined grid layout to the dialog
        self.setLayout(self.mainLayout)
        self.update()

    def handleSliderValue(self):
        # set slider value as angle
        starWheel.Placement.Rotation.Angle = math.radians(self.slider.value())
        # output current angle
        self.CurrentAngle.setText(str(self.slider.value()))
        # solve the constraints 
        a2p_solver.solveConstraints(document)
        # update the view after the solving ('Gui' stands for 'graphical user interface')
        FreeCADGui.updateGui()
        # wait some time, important to give time to perform calculations
        time.sleep(timeout)

    def setMinEdit(self):
        # assure that the minimum is samller than the maximum
        if self.MinEdit.value() >=  self.MaxEdit.value():
            self.MaxEdit.setValue(self.MinEdit.value() + 1)
        self.slider.setRange(self.MinEdit.value(), self.MaxEdit.value())

    def setMaxEdit(self):
        # assure that the minimum is samller than the maximum
        if self.MinEdit.value() >=  self.MaxEdit.value():
            self.MinEdit.setValue(self.MaxEdit.value() - 1)
        self.slider.setRange(self.MinEdit.value(), self.MaxEdit.value())

    def CloseClicked(self):
        AnimationDialog.close()

# create and show the defined dialog
AnimationDialog = AnimationDlg()
AnimationDialog.show()

# run this loop when the dialog is visible
while AnimationDialog.isVisible():
    # update the view; important to give the OS feedback the dialog is alive
    FreeCADGui.updateGui()
    # bring the dialog to front, so that the dialog is always visible
    QtGui.QWidget.raise_(AnimationDialog)
    # output slider value here too because during the calculation the slider might have been moved
    AnimationDialog.CurrentAngle.setText(str(AnimationDialog.slider.value()))

The dialog defined in the script looks like this:

A2p AnimationDialog.png

Script Commands

To understand the script syntax better, here is some command info:

starWheel.Placement.Rotation.Angle = math.radians(angle)

Here we change the placement property Rotation.Angle of the part get got previously as starWheel. This property gets the angle as radian. The function radians() from the library math converts the angle from degree to radian.

The property Rotation.Angle uses the current placement axis of the part (in our example the X-axis). To rotate the part e.g. around the Z-axis one can set the rotation axis (before calling the rotation command) using the command:

starWheel.Placement.Rotation.Axis = FreeCAD.Vector(0,0,1)

Instead of rotating, parts can also be moved. To change for example the placement in Y-direction of the wheel, the command would be:

starWheel.Placement.Base.y = PositionShift

In this case we would not define the variable angle but PositionShift that we change on every loop run.

There are different ways to set the placement of a part. Some are documented here. Unfortunately there is no list (yet) with all possible placement commands.

a2p_solver.solveConstraints(document, useTransaction=False/True)

This is an A2plus-specific command. It solves the assembly constraints of the assembly we previously got as document. The option useTransaction specifies if FreeCAD should store every change in the undo/redo stack. For large animations you might therefore set it to false.