Il precedente tutorial era terminato, all'uscita dalla sala operatoria, con una finestra romboidale, bella, sana, e di robusta costituzione. E con una "voglia" insoddisfatta quella intrigante finestra a stella, che non metteremo mai nei nostri progetti, ma vorremmo tanto avere in libreria, per poter dire "questa l'ho fatta io".
Come vi avevo anticipato, la cosa è abbastanza semplice, una volta imparata la procedura per trasformare un cPRISM_ in un WALLHOLE. Ricorderete che il problema consiste nel fatto che questo comando permette di definire solo poligoni convessi. Se il perimetro del foro ha delle concavità otterremo dei messaggi di errore e il malfunzionamento della finestra.
Ricordiamo (ma lo sanno tutti) come si riconosce un poligono convesso: Appoggiando una retta infinita su ciascun lato (o una serie di tangenti, per i lati curvi) il poligono si deve trovare tutto da una parte. Se è possibile posizionare questa retta su un qualsiasi lato in modo da intersecare una parte del poligono, questo è concavo.
Ma nulla vieta di usare più WALLHOLE in un singolo oggetto. Ricorderete che il nostro punto di partenza, per generare il foro nel muro, era il famoso solaio "Erba" da un metro di spessore. Tutto il processo si risolve dunque nella preventiva scomposizione del solaio (e quindi della sagoma del foro-finestra) in elementi convessi. Ci sono sempre molti modi per arrivare a questo risultato. Un sistema comodo (fin troppo) può essere quello di usare l'opzione "triangola" del comando esterno "geometria poligoni". Se è installato l'apposito Add-on troverete questo comando nel menu Strumenti. Sul solaio saranno tracciate delle linee che lo dividono in triangoli (che non possono essere mai concavi, quindi per noi sono l'ideale). Con il comando "dividi" si può successivamente tagliare il solaio.
Nell'immagine soprastante vediamo il risultato della divisione in automatico. Liberissimi di usarla, naturalmente, ma credo che la maggior parte voi, ragionando da "umani" avrebbe pensato a una divisione più semplice, probabilmente come quella di figura 2.
Io, per rendere l'oggetto ancora più semplice e "leggero", opterei per la soluzione di figura 3. Con due soli tagli si ottengono tre poligoni convessi, da trasformare in altrettanti WALLHOLE.
A questo punto non c'è molto da aggiungere. Realizzati i vari componenti con i solai, come abbiamo visto la volta scorsa, basta registrare come Finestra e riaprire lo script GDL 3D.
Questa volta ci saranno tre solai "Erba" e quindi tre istruzioni cPRISM_ da modificare, ma niente di più. Come abbiamo imparato a fare, identifichiamo le linee di programma su cui intervenire, effettuiamo l'operazione eliminando, per ciascuno, la linea
cPRISM_ "Erba", "Erba", "Erba",
(compresa la virgola) e inserendo semplicemente il termine WALLHOLE all'inizio della linea seguente.
Troppo poco, per farci un articolo. E allora andiamo avanti. Facciamo un altro esempio: useremo due WALLHOLE per una finestra, ma questa volta non ci serve un foro unico, ma due fori distinti. Riusciremo a crearci un nuovo problema e avremo così l'occasione per trovare nuove soluzioni.
Immaginiamo di aver bisogno di una bifora. È il principio, quello che ci interessa, non l'estetica, quindi, per fare una cosa semplice, accontentatevi di due fori trapezoidali. Seguendo tutta la trafila che ormai abbiamo imparato a padroneggiare, in pochi minuti ecco pronta la nostra finestra di libreria, perfettamente funzionante nel 3D. Ma questa volta il problema si presenta da un'altra parte il simbolo 2D è incompleto! Mentre nel 3D il muro viene interrotto solo dai fori definiti con WALLHOLE, in pianta viene sempre interrotta la continuità del muro per l'intera larghezza dell'apertura. L'oggetto è composto da due ante separate, che vengono correttamente rappresentate nel simbolo, ma il pilastrino centrale dovremo aggiungerlo noi. Ci sono due modi: uno facile e uno difficile.
Ovviamente quello da usare è il modo difficile ;)
Comunque vediamo rapidamente il modo facile, e spieghiamo perché non va bene. Certamente la soluzione più ovvia è quella di aprire la finestra Simbolo 2D e aggiungere un retino uguale a quello del muro, nella giusta posizione e con le giuste dimensioni. Si noterà però una serie di problemi: primo fra tutti che non sappiamo in partenza su che muro andrà la finestra e se deve essere usata su muri diversi (per colore, tipo di campitura, spessore, ecc.) dovremmo realizzare più copie dell'oggetto. In poche parole: non è parametrico. Non si adatta alle circostanze manca di quell'"intelligenza" che è il vero punto di forza degli oggetti GDL.
E allora andiamo nell'altra direzione, quella difficile. Si tratta come avrete immaginato di rientrare in sala operatoria, e intervenire sullo script GDL 2D.
Seguitemi con fiducia, anche se non spiegherò i dettagli. Per ogni passaggio vi dirò semplicemente cos'è e perché è necessario, senza addentrarmi troppo nelle specifiche del linguaggio. La prima cosa da fare scrivere l'istruzione MUL2 seguita dal rapporto fra le variabili A e B e le corrispondenti misure della finestra (larghezza e altezza). La mia bifora era larga un metro e venti e alta uno, quindi:
MUL2 a/1.2, b/1
Questa istruzione fa sì che, anche usando delle misure reali, non delle variabili, queste possano essere adattate, "stirando" lo spazio nel quale si trovano.
La seconda istruzione predispone l'uso di un tipo di linea. Non uno qualunque, ovviamente, ma il tipo di linea impostato per il muro corrente, quello su cui si trova la finestra:
LINE_TYPE WALL_LINETYPE
Quest'altra fa la stessa cosa con il tipo di retino: FILL WALL_FILL
Ed infine questa imposta la penna da utilissare per le linee: PEN WALL_SECT_PEN
Abbiamo finito la fase "preparatoria", ed ora scriveremo l'istruzione che disegna effettivamente il retino. Ma prima descriviamola.
La sintassi, dal manuale del GDL, è la seguente:
POLY2_B n, framefill, fillpen, fillbkgdpen, x1, y1, mask1, ..., xn, yn, maskn
descriviamone brevemente le varie parti:
POLY2_B
questo è il nome del comando n è il numero di vertici del poligono (retino).
Per il nostro rettangolo al posto della "n" metteremo il numero 4. framefill è un codice, prendiamolo così com'è. Nel nostro caso useremo il valore 7, per questo parametro. fillpen la penna da usare per la campitura del retino. Per utilizzare il colore impostato per il muro corrente, useremo una variabile globale: WALL_FILL_PEN.
fillbkgdpen
la penna dello sfondo del retino. Anche questa può essere letta da una variabile globale:
WALL_FBGD_PEN. x1, y1
coordinate del primo vertice.
mask1 un codice di controllo. Usando il valore 1, la linea verrà tracciata, usando 0 il lato sarà omesso.
Il mio pilastrino era largo 20 cm, le coordinate dei 4 angoli del retino, per un muro spesso 30 cm, dovrebbero esser le seguenti:
-0.10, 0.00
-0.10, -0.30
0.10, -0.30
0.10, 0.00
per prima cosa, però dobbiamo renderci indipendenti dallo spessore del muro. Il pilastrino dovrà adattarsi a qualsiasi spessore, e quindi cambiamo il valore 0.30 con la variabile globale WALL_THICKNESS, senza dimenticare di farla precedere dal segno meno.
-0.10, 0.00
-0.10, - WALL_THICKNESS
0.10, - WALL_THICKNESS
0.10, 0.00
potrebbe già andare bene, ma c'è ancora una trappola. Se si definisce un rientro dell'infisso, tutto l'oggetto finestra viene traslato della misura definita nel relativo campo. Tutto, compreso il pilastrino, che andrà a sporgere dalla parte opposta. Dobbiamo quindi sommare alle coordinate Y un valore pari a questo spostamento (che è considerato negativo). Sapendo che tale valore è memorizzato nella variabile globale WIDO_SILL, le coordinate diventano:
-0.10, WIDO_SILL -0.10
WIDO_SILL -WALL_THICKNESS
0.10, WIDO_SILL -WALL_THICKNESS
0.10, WIDO_SILL
ecco quindi che, finalmente, siamo in grado di scrivere la fatidica istruzione:
POLY2_b 5, 7, WALL_FILL_PEN, WALL_FBGD_PEN,
-0.10, WIDO_SILL, 1,
-0.10, WIDO_SILL-WALL_THICKNESS, 1,
0.10, WIDO_SILL-WALL_THICKNESS, 1,
0.10, WIDO_SILL, 1
Manca ora solo un particolare. Se la finestra Testo GDL 2D è vuota, allora ArchiCAD mostra il disegno contenuto nella finestra Simbolo 2D. Se invece contiene del testo, verrà usato solo questo, per generare il disegno di pianta. A meno che non venga richiamato esplicitamente anche il simbolo disegnato. Ed è quello che faremo noi:
FRAGMENT2 all,0
Il parametro "all" comunica di visualizzare tutti i "fragment", ossia i lucidi del disegno 2D. Il successivo valore zero indica che devolo essere usati i colori e tipi linea originale, non quelli correnti.
Ecco quindi tutto lo script:
LINE_TYPE WALL_LINETYPE
FILL WALL_FILL
PEN WALL_SECT_PEN
POLY2_B 4, 7, WALL_FILL_PEN, WALL_FBGD_PEN,
-0.10, WIDO_SILL, 1,
-0.10, WIDO_SILL - WALL_THICKNESS, 1,
0.10, WIDO_SILL - WALL_THICKNESS, 1,
0.10, WIDO_SILL, 1
FRAGMENT2 all,0