Edytor masek VLSI

Struktura programu


Ze względu na to, iż program został napisany przy użyciu biblioteki działającej w oparciu o system zdarzeniowy nie da się jednoznacznie nakreślić grafu przedstawiającego algorytm działania programu.

Zastosowana biblioteka (FOX) to bogaty zestaw klas reprezentujących obiekty, które pozwalają na budowanie tzw. "wigetów" (obiektów graficznych np. przycisk, pasek przewijania czy menu) typowych dla wszystkich systemów z interfejsem graficznym. Komunikacja między obiektami następuje za pomocą komunikatów, które są wynikami pewnych zdarzeń w obrębie aplikacji. Każdy komunikat zawiera informację o jego typie, adresacie i nadawcy oraz pewne dodatkowe dane zależne od typu wywołującego go zdarzenia. Zdarzeniem jest np. kliknięcie klawiszem myszki, przesunięcie wskaźnika myszki nad obiektem, naciśnięcie klawisza na klawiaturze oraz wiele innych operacji, czasem bardziej złożonych (np. operacje "Drag and Drop"). Dzięki połączeniu obiektów w określoną hierarchię (za pomocą wskaźników) wygenerowany komunikat wędruje między obiektami do czasu aż jeden z nich podejmie się jego obsługi.

Zadaniem programisty korzystającego z biblioteki FOX jest zbudowanie aplikacji poprzez utworzenie klas dziedziczących z podstawowych klas biblioteki oraz z samych klas podstawowych a następnie zdefiniowanie funkcji odpowiadających za obsługę wybranych komunikatów (poprzez przeciążanie wybranych funkcji klas podstawowych lub przyporządkowywanie komunikatom własnych funkcji).

W naszym przypadku chodziło głównie o obsługę zdarzeń generowanych przez myszkę, gdy znajdowała się ona nad obiektem glcanvas. Pozostałe komunikaty generowane były przez odpowiednie opcje w menu, niezależnie od tego czy zostały one kliknięte czy wybrane za pomocą skrótu klawiaturowego. Stan klawiszy Control oraz Shift jest przekazywany wraz komunikatami, więc nie było potrzeby tworzenia specjalnych funkcji odpowiedzialnych za obsługę klawiatury.

Poniżej znajduje się opis elementów projektu które odgrywają kluczową role.

nazwa elementu opis

klasa
VLSIWindow

Największa klasa aplikacji zawierająca opis wyglądu głównego okna programu. To w tej klasie definiowane są wszystkie funkcje odpowiedzialne za obsługę komunikatów.

klasa
LayerDlg
Opisuje wygląd i zachowanie dialogu zawierającego listę warstw.
obiekt
glcanvas
To obiekt typu FXGLCanvas, którego zadaniem jest przygotowanie obszaru ekranu pozwalającego na rysowanie obiektów za pomocą biblioteki OpenGL oraz  obsługa zdarzeń związanych z myszą.
klasa
Rect
Klasa ta to opis obiektu, jakim jest prostokąt. Zestaw metod tej klasy pozwala na wykonywanie podstawowych operacji na takim prostokącie: przemieszczanie, zmiana rozmiaru, sprawdzanie położenia punktów i innych prostokątów względem siebie itp. Ważną funkcją jest także sprawdzanie czy operacje na prostokącie nie powodują, iż jego rozmiar staję się ujemny i korygowanie takich sytuacji. Dodatkowo klasa zawiera specjalne pole informujące o tym czy dany obiekt jest zaznaczony oraz funkcje do zmiany tego pola.
Wirtualna funkcja Draw pozwala na późniejsze rysowanie wszystkich obiektów dziedziczących z Rect w jeden logiczny sposób (np. w wypadku gdy są one umieszczane tablicy, lub jak w naszym przypadku na liście). Dodatkowy parametr przekazywany do funkcji ma umożliwiać późniejsze sterowanie rysowaniem obiektu bez zmiany jego stanu - np. rysowanie obiektów w różnej skali, w nieco innym kolorze lub za pomocą innego kroju czcionki. Pozostałe funkcje wirtualne pozwalają na to by obiekty w inny sposób reagowały na np. zmianę rozmiaru (np. nie względnie lecz proporcjonalnie).
klasa
MouseRect
Klasa ta ma za zadanie przechowywanie parametrów myszy - obecnego trybu pracy, stanu klawiszy, pozycji oraz (co najważniejsze) opis prostokąta utworzonego po naciśnięcie klawisza myszy, przemieszczenie kursora i zwolnienie klawisza. Daje to możliwość (dzięki dziedziczeniu z klasy Rect) na łatwą analizę koordynat myszy względem obiektów na ekranie.
klasa
GroupNode
Klasa ta dostarcza obiektu pozwalającego na budowanie wielopoziomowych list. Ponieważ dziedziczy ona z klasy Rect staje się ona zarazem klasą bazowa dla wszelkiego typu obiektów jakie potem są rysowane na ekranie - obiekty te można przechowywać na liście, grupować itp., a zarazem rysować i zmieniać jak Rect.
Ze względu na brak czasu funkcje dotyczące grupowania oraz operacji na grupach nie są wciąż zaimplementowane.
klasa
Box
Jest to klasa reprezentująca zwykły obiekt na dowolnej warstwie: zawiera przeciążoną funkcję Draw, której zadaniem jest rysowanie prostokąta o parametrach przechowywanych we wnętrzu obiektu. Np. obiekty na warstwie Options oraz napisy i symbole elementów do symulacji są oznaczane inaczej i wymagają zdefiniowania odrębnych klas.
klasa
Opt
Jest to klasa reprezentująca obiekt na warstwie Options. Różni się od Box dodatkowym polem typu int i oczywiście funkcją Draw.
klasa
Layer
Zadaniem tej klasy jest stworzenie interfejsu pozwalającego na wykonywanie podstawowych operacji na pojedynczej warstwie: dodawanie/usuwanie obiektów, zmiana ich stanu, rysowanie wszystkich elementów warstwy itp. Przekazywanie poleceń w postaci "sygnałów" pozwala na łatwiejszą implementację opcji takich jak UNDO/REDO czy COPY/PASTE oraz na śledzenie operacji wykonywanych na danej warstwie. Różna obiekty przechowywane w danej warstwie mogą wymagać różnego sposobu obsługi pewnych komunikatów (mogą np. w zupełnie inny sposób przechowywać elementy w schowku lub w buforze UNDO), a zarazem klasy dziedziczące z Layer powinny mieć możliwość obsługi nowych opcji bez konieczność definiowania nowych metod.
pliki
resources.h
resources.cpp
declare_res.h
create_res.h
Pliki te są generowane przez odpowiedni skrypt (w systemie Linux) i zawierają definicje/deklaracje ikon używanych przez program.


powrót do strony głównej