Simulazione Sistema Idraulico - Estensione

Estendere all'interno della classe HSystemExt le funzionalità già implementate nella classe HSystem.

La nuova classe HSystemExt estende la classe HSystem.

R5. Multi-split

La classe Multisplit rappresenta un'estensione delle classe Split che prevede più uscite. Il costruttore accetta, oltre al nome, il numero di uscite.

Il metodo connect() riceve due parametri: l'elemento da collegare ed il numero dell'uscita a cui collegarlo. Le uscite sono numerate a partire da 0

Per sapere quali elementi sono connessi in uscita ad un multisplit, è possibile utilizzare il metodo getOutputs() che restituisce un array con gli elementi connessi. Se nessun elemento è connesso ad una certa uscita, la cella corrispondente dell'array è null.

In preparazione alla simulazione è possibile utilizzare il metodo setProportions() che accetta una serie di double che definiscono la proporzione con cui ripartire il flusso in ingresso sulle uscite.

R6. Visualizzazione

Il metodo layout() della classe HSystemExt (attenzione: non HSystem) restituisce una stringa che contiene la disposizione degli element del sistema utilizzando caratteri ASCII e opportune spaziature.

Ogni elemento viene stampato nella forma "[name]Type" dove name è il nome dell'elemento e Type è la classe dell'elemento. La connessione tra uscita di un elemento e ingresso di un altro è rappresentata dal simbolo "->" mentre l'assenza di un elemento connesso in uscita è rappresentata da "*". Nel caso di più elementi connessi a valle di un elemento si usa il carattere "+" e si riporta la prima connessione sulla stessa riga, e in righe successive si ripete "+" (allineato verticalmente al primo) e poi si riportano le altre connessioni. Le righe che separano le connessioni multiple (almeno una, ma potrebbero essere più di una se a valle ci sono altri elementi con uscite multiple) si riporta il carattere "|" allineato verticalmente a "+".

Per esempio, un sistema composto da una Source connessa a un Tap, che è connesso a uno Split le cui uscite sono connesse a due Sink, avrebbe un layout simile al seguente:

[Src]Source -> [R]Tap -> [T]Split +-> [sink A]Sink
                                  |
                                  +-> [sink B]Sink 

R7. Eliminazione elementi

Il metodo deleteElement() della classe HSystemExt permette di eliminare un elemento precedentemente aggiunto al sistema; il metodo accetta come parametro il nome dell'elemento da eliminare.

Se l'elemento è uno Split o un Multisplit con più di una uscita connessa, non viene effettuata alcuna operazione ed il metodo restituisce false.

Altrimenti (Split o Multisplit con al più una uscita connessa oppure un altro tipo di elemento) l'elemento viene rimosso dal sistema e, se l'elemeto da eliminare è connesso ad altri elementi in ingresso e/o in uscita, occorre modificare modificare le connessioni di conseguenza in modo che l'elemento a monte sia connesso a quello a valle. In questo secondo caso il metodo restituisce true. Riprendendo l'esempio in R6, il layout dopo l'eliminazione di R deve essere il seguente:

[Src]Source -> [T]Split +-> [sink A]Sink
                        |
                        +-> [sink B]Sink

R8. Portata massima elementi ed allarmi

La nuova classe ElementExt estende la classe Element aggiungendo il metodo setMaxFlow(), che accetta come parametro un numero reale che rappresenta la portata massima di un elemento. Se un elemento riceve una portata in ingresso maggiore della portata massima, l'elemento rischia di rompersi. Per gli oggetti di classe Source, non avendo questi ultimi alcun ingresso, le chiamate al metodo setMaxFlow() non devono sortire alcun effetto.

La classe HSystemExt contiene un overload del metodo simulate che accetta come parametro il valore booleano enableMaxFlowCheck: se quest'ultimo è settato a vero, il metodo deve effettuare il controllo aggiuntivo sulla portata massima, notificando un errore se la portata in ingresso di un elemento è superiore alla sua portata massima. Il metodo simulate accetta in ingresso anche un oggetto che implementa la classe SimulationObserverExt, estensione dell'interfaccia SimulationObserver, che aggiunge a quest'ultima il metodo notifyFlowError, attraverso il quale è possibile notificare l'errore sulla portata massima, passando il tipo di elemento (nome della classe), il nome dell'elemento, il flusso in ingresso e la sua portata massima.