Compattamento


Con il comando compattamento Compattamento ho cercato di introdurre un semplice algoritmo di ottimizzazione degli spazi.
Quel primo algoritmo è stato sostituito da uno più preformante: l'algoritmo MaxRects e successivamente affiancato dall'algoritmo Floor / Ceiling.

NOTE & RICONOSCIMENTI: L'algoritmo MaxRects usato in FitPlot è ispirato al lavoro A Thousand Ways to Pack the Bin - A Practical Approach to Two-Dimensional Rectangle Bin Packing by Jukka Jylänki. L'algoritmo adottato (MaxRects) è stato ulteriormente ottimizzato ed adattato ai bisogni di FitPlot. Per spiegazioni tecniche vedere l'Algoritmo MaxRect a fondo pagina.

L'algoritmo Floor / Ceiling è basato sul lavoro Algorithms for Two-Dimensional Bin Packing and Assignment Problems di Andrea Lodi.

Una breve dimostrazione video che mostra l'uso pratico del compattamento è presente sul Canale YouTube di FitPlot


Premessa:

Il compattamento prende in considerazione l'ingombro di ogni singola immagine implicata.
Per ingombro si intende il rettangolo minimo che contiene l'immagine. Questo significa che se un'immagine è ruotata, l'ingombro non sarà più rappresentato dalle semplici dimensioni AxB dell'immagine, ma da un nuovo rettangolo più grande, a seconda della rotazione.
Con la versione 5 di FitPlot contribuiscono all'ingombro anche gli eventuali stili applicati (tag testuali, bordi, segni di taglio e ombreggiatura) in modo che nel compattamento ne venga tenuto conto.
Anche i gruppi, introdotti in FitPlot 5, hanno un'ingombro proprio che è dato dalla somma degli ingombri dei singoli componenti all'atto della creazione del gruppo (al netto di successive rotazioni, ridimensionamenti e ritagli).


Uso del comando:

Cliccando sul comando nella barra strumenti (oppure da menu Strumenti->Compatta…, possiamo ottenere un compattamento delle immagini presenti sul foglio verso l'alto della pagina.

Il comando compatta… (cmd - enter) mostra questo dialogo:

Dialogo compattamento
Sono disponibili due algoritmi di compattamento:

MaxRects: questo algoritmo è quello che generalmente fa risparmiare più carta, cercando di utilizzare ogni spazio possibile, a discapito però dell'allineamento delle immagini che alla fine possono risultare, con immagini di dimensioni diverse, alquanto sfalsate.

Floor / Ceiling: in questo caso si predilige la disposizione delle immagini lungo linee ideali (floor / ceiling). Lo spreco di carta è di solito maggiore che nel MaxRect, ma avremo il vantaggio di una maggior facilità di ritaglio delle immagini alla fine.

Indipendentemente dall'algoritmo scelto ci sono tre tipi di compattamento possibili:
  • Aggiungi pagine necessarie (ideale per stampanti a foglio singolo)
  • Espandi / contrai area di stampa (adatto a plotters con alimentazione a rotolo)
  • Compatta in area (definita dall'utente)

Aggiungi pagine: In questo caso l'algoritmo cerca di riempire la pagina attuale dall'alto verso il basso. Quando non c'è più spazio, una nuova pagina è generata e il riempimento continua su questa e così via fino a che l'ultima immagine non è a posto. Alla fine, se sono state necessarie più pagine, il cassetto laterale delle pagine viene aperto.

Espandi / contrai: Le immagini sono distribuite su un'unica pagina che verrà adattata sfruttando la larghezza massima possibile (ampiezza del rotolo) ed usando la lunghezza minima necessaria.
Per questo particolare compito (autoridimensionamento del foglio), 4 nuovi campi si sono resi necessari nel dialogo di impostazione margini, contenenti i valori minimi e massimi che il foglio può assumere per la stampante in uso.
Con queste informazioni l'algoritmo può regolarsi su come espandere / ridurre il foglio per una massima ottimizzazione della disposizione delle immagini sul foglio vedi [impostazione margini per compattamento ].

Compatta in area: Le immagini vengono disposte all'interno di un'area che sta all'utente definire: all'uscita del dialogo viene mostrato il messaggio:

A questo punto dovremo definire con il mouse un rettangolo (clic e trascina) da riempire con le immagini da compattare. Possiamo servirci, prima di cominciare, dello zoom della finestra, di un suo scorrimento e di tutto quel che occorre per poter tracciare agevolmente l'area.

Al rilascio del mouse, se possibile, le immagini da impacchettare saranno raccolte nell'area definita.


Le altre opzioni presenti nel dialogo sono descritte di seguito:

  • Gap: con questo valore stabiliamo un distacco minimo tra le immagini (per avere spazio per ritagliarle ecc.).
  • Consenti la rotazione di 90°: con questa opzione, l'algoritmo di compattamento sa che un'immagine può essere ruotata e, se c'è convenienza, in termini di minor spazio necessario, alcune immagini potrebbero risultare ruotate alla fine del processo.
  • Non considerare i margini: ci sono parecchie situazioni in cui le dimensioni dell'immagine coincidono con quelle dalla pagina (pensa ad un PDF A4). In tali casi, il normale compattamento (un'immagine per pagina), non funzionerebbe a meno che non escludiamo i margini dal calcolo. In questo modo è l'intera pagina ad essere considerata dall'algoritmo, di conseguenza, se l'immagine coincide con la pagina, il compattamento avrà luogo.
    Nota importante: se, nonostante tutto, appare ancora un avvertimento dicendo che non c'è spazio per il compattamento, questo può esser dovuto a pochi millesimi di differenza tra le dimensioni della pagina e dell'immagine. Controlla e imposta i valori delle rispettive dimensioni usando (temporaneamente) come unità di misura i punti invece dei pollici o dei centimetri. Spero di risolvere più elegantemente questo piccolo problema nella prossima versione.
  • Ridimensiona immagini (quando necessario). Questa opzione permette di ridimensionare quelle immagini che altrimenti non potrebbero entrare nell'area perché troppo grandi.
  • Compatta oggetti selezionati: con questa opzione possiamo agire su immagini selezionate (ad esempio per riempire una determinata area con alcune immagini lasciando inalterato il resto). Da notare che nel caso di compattamento automatico all'inserimento (vedi paragrafo inserimento avanzato, le immagini appena importate sono le sole selezionate).
  • Compatta tutti gli oggetti: questo è il funzionamento di default del compattamento. Agisce su tutti gli oggetti presenti nel documento, indipendentemente dalla loro selezione.
  • Registra impostazioni nelle preferenze: cliccando qui si salvano le impostazioni appena usate nelle preferenze. Queste impostazioni sono usate in alcune operazioni automatiche, per esempio nelle opzioni di inserimento immagini (vedi paragrafo inserimento avanzato).

    Suggerimento: il dialogo di compattamento appena visto può essere bypassato tenendo premuto il tasto alt (option) mentre clicchiamo sullo strumento packing tool. Ovviamente i parametri di compattamento usati in questo caso saranno quelli prelevati dalle attuali preferenze.

Impostazione margini per compattamento

Dal menu Strumenti->Imposta Margini… riempi i campi in basso:

Dialogo setup margini

Per quel che riguarda le dimensioni minime, puoi vedere nei formati disponibili per il plotter / stampante in questione (nel menu Formato di Stampa…) e scegli il più piccolo della lista.
Per le dimensioni massime, invece, la larghezza dovrebbe corrispondere alla larghezza del rotolo / foglio caricato (24", 36", 42" ecc.), l'altezza può essere un valore arbitrariamente lungo (io ho impostato [e stampato] 6 metri sul mio HP 500 PS).
Nota: Se tutti i campi di minima e massima dim. del foglio sono lasciati (o reimpostati) a 0, non saranno considerati dall'algoritmo di compattamento.


Preferenze compattamento

Ogni documento (quindi anche un documento template) può avere le proprie preferenze di compattamento che sono impostabili dal dialogo preferenze.
Le varie voci sono le stesse già elencate nel dialogo di compattamento. Una volta impostati i vari settaggi nelle preferenze, li troveremo tali e quali all'apertura del dialogo di compattamento, oppure potremo eseguire un compattamento senza dialogo con le impostazioni qui registrate, cliccando sul pulsante di compattamento packing tool con il tasto [alt] premuto.
Nelle preferenze di compattamento ci sono anche le impostazioni degli algoritmi da usare nel compattamento. Una nota tecnica a riguardo è la seguente:


L'algoritmo MaxRects

Euristiche (tentativi) MaxRects. L'algoritmo MaxRects "decide" di assegnare un "punteggio" quando sposta un immagine nell'area disponibile. Questo punteggio viene calcolato dall'algoritmo in modi diversi, basando le sue decisioni in base ai metodi euristici. Metodi differenti possono portare a risultati (di solito leggermente) differenti.
L'algoritmo lavora molto velocemente, perciò non ci si dovrebbe preoccupare di provare tutti i metodi disponibili (lasciandoli quindi su [ON]. L'operazione di packing prova tutti i metodi a [ON], esamina ciascun risultato (numero di pagine raggiunte per il packing multipagina, massimo valore di Y per la singola pagina ridimensionabile) prima di spostare alcunché, sceglie il metodo migliore, quindi ri-esegue il compattamento con il metodo risultato vincente.
Di solito tutta l'operazione impiega pochi attimi, nella maggior parte dei casi, ma se si ha a che fare con centinaia di immagini, il dover calcolare tutti i metodi euristici può essere penalizzante in termini di tempo, perciò ho lasciato la possibilità di poter escludere fino a tre dei quattro metodi (uno deve per forza essere attivo).

Al momento abbiamo i seguenti 4 metodi euristici, impostabili nelle preferenze di packing:

  1. BSSF Best Short Side Fit: Sceglie le immagini che riempiono megnli il loro lato corto. Questo metodo è quello usato di default e obbigatorio (uno deve essere usato per forza!), poiché è il più adatto per i casi generici.
  2. WSSF Worst Short Side Fit: Questo è l'inverso del BSSF ed è opzionale.
  3. BLF Bottom Left Fit: Questo metodo cerca di tenere il compattamento più basso possibile, è ideale per il compattamento con pagina ridimensionabile, poiché la pagina risultante è più compatta.
  4. BAF Best Area Fit: Un metodo alternativo, attribuisce il punteggio più alto per una migliore area occupata.
Altri metodi potrebbero essere aggiunti in future versioni.