Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:miw08_prolog_ardxpce [2008/09/29 00:26] miw |
pl:miw:miw08_prolog_ardxpce [2019/06/27 15:50] (aktualna) |
====== Sprawozdanie ====== | ====== Sprawozdanie ====== |
| |
==== 1. Wstęp: ==== | |
| |
=== a. Środowisko pracy: === | |
| |
| |
Wszystkie przykłady tworzone i testowane były w systemie Ubuntu. | |
| |
=== b. Oprogramowanie: === | |
| |
| |
== i. SWI-Prolog == | ==== 1. Wstęp: ==== |
| |
| == a. Środowisko pracy: == |
| |
== ii. XPCE == | Przykład tworzenia grafu w XPCE był realizowany w środowisku Windows XP za pomocą programu SWI-Prolog/XPCE for MS-Windows 5.6.61. Alternatywą jest możliwość uruchomienia na platformie Linux, z powodów trudności z uruchomieniem i konfiguracją nie wybrałem tej możliwości. |
| |
=== c. Biblioteka XPCE w Prologu: === | == b. Oprogramowanie: == |
| |
| Po pobraniu i zainstalowaniu programu [[http://www.swi-prolog.org/dl-stable.html|SWI-Prolog/XPCE for MS-Windows 5.6.61]], mozliwa była praca z Prolog/XPCE w środowisku Windows. Możliwości i działanie aplikacji pod systemem Windows jest bardzo zbliżona do pracy pod systemem Linux-owym. |
| |
XPCE to zestaw narzędzi wspomagający tworzenie GUI pod język Prolog. Jest zorientowane obiektowo, daje możliwość tworzenia klas, metod, waruków, iteracji... Procedury zawarte w XPCE tworzone są w C. Jest możliwe do uruchomienia w różnych środowiskach pracy. Dane z Prologa mogą być powiązane ze zmiennymi w XPCE. Zaimplementowane jest za pomocą własnej biblioteki VWS (Virtual Window System) która, definiuje metody do tworzenia i manipulacji oknami, prostymi obiektami jak: linie, kółka, tekst oraz obsługi zdarzeń. Dzięki swojej budowie, programy używające XPCE są w pełni przenośne pomiędzy różnymi środowiskami pracy. | == c. Biblioteka XPCE w Prologu: == |
| |
=== d. Konstrukcja grafów ARD (Atribute Relationship Diagram): === | XPCE to zestaw narzędzi wspomagający tworzenie GUI pod język Prolog. Jest zorientowane obiektowo, daje możliwość tworzenia klas, metod, warunków, iteracji... Procedury zawarte w XPCE tworzone są w C. Jest możliwe do uruchomienia w różnych środowiskach pracy. Dane z Prologa mogą być powiązane ze zmiennymi w XPCE. Zaimplementowane jest za pomocą własnej biblioteki VWS (Virtual Window System) która, definiuje metody do tworzenia i manipulacji oknami, prostymi obiektami jak: linie, kółka, tekst oraz obsługi zdarzeń. Dzięki swojej budowie, programy używające XPCE są w pełni przenośne pomiędzy różnymi środowiskami pracy. |
| |
| == d. Konstrukcja grafów ARD (Atribute Relationship Diagram): == |
| |
Diagram ARD identyfikuje atrybuty systemu i wskazuje na zależności pomiędzy nimi. W ARD występują dwa rodzaje elementów: atrybuty (attributes) i właściwości (properties). Poniżej przedstawiam przykład diagramu ARD dla problemu budowy kontrolera temperatury: | Diagram ARD identyfikuje atrybuty systemu i wskazuje na zależności pomiędzy nimi. W ARD występują dwa rodzaje elementów: atrybuty (attributes) i właściwości (properties). Poniżej przedstawiam przykład diagramu ARD dla problemu budowy kontrolera temperatury: |
| |
{{:pl:miw:oraz1.png|:pl:miw:oraz1.png}} | {{:pl:miw:oraz1.png|:pl:miw:oraz1.png}} |
| |
| |
| |
| |
==== 4. Wiadomości wstępne o XPCE: ==== | ==== 4. Wiadomości wstępne o XPCE: ==== |
?-free(@demo). | ?-free(@demo). |
| |
| == e. Tworzenie figur: == |
| |
| arrow - Służy do tworzenia strzałek. |
| |
| bezier - Tworzy krzywe Bezier`a. |
| |
==== 5. Projekt:==== | bitmap - Umieszcza obraz, kolorowy jak i monochromatyczny. |
| |
| box - Tworzy figury takie jak kwadrat i prostokąt, o ostrych lub zaokrąglonych rogach. |
| |
| circle - Słuzy do otrzymywania okręgów. |
| |
| ellipse - Tworzy figury o kształcie elips, może być wypełnione. |
| |
| line - Tworzy linię prostą, może służyć do tworzenia strzałek. |
| |
Jedynym pomysłem na tworzenie diagramów ARD w XPCE, jest ręczne przygotowanie pliku *.pce, który po załadowaniu wyświetli zawarte w nim informacje. Uproszczeniem procesu tworzenia pliku była by prosty edytor. Aby móc przygotować potrzebny plik musimy widzieć jak tworzyć odpowiednie figury, jak je ze sobą łączyć, w jaki sposób możemy mieć na nie wpływ. | path - Wielo linia przechodząca przez kilka punktów. |
| |
== a. Tworzenie figur: == | text - Służy do wyświetlania tekstu. |
| Przykład: |
| |
?- send(@p, display, | ?- send(@p, display, |
new(@box, box(100,100))). | new(@box, box(100,100))). - kwadrat |
| |
| == f. Łączenie i działanie na figurach: == |
| |
| device - Most generic compound graphical object. The window is a subclass of |
| device and all graphical operations are defined on class device. |
| |
| figure - Subclass of device, provides clipping, background, containing rectangle, |
| border and the possibility to show a subset of the displayed graphical objects. |
| |
| format - A format object specifies a two-dimensional table layout. Formats may be |
| associated to graphical devices using ‘device ! format’. |
| |
| table - The successor of format realises tabular layout compatible to the HTML-3 |
| model for tables. |
| |
| connection - Subclass of class line. A connection can connect two graphicals |
| on the same window that have handles. The line is automatically |
| updated if either of the graphicals is moved, resized, changed |
| from device, (un)displayed, hidden/exposed or destroyed. |
| |
| handle - Defines the location, nature and name of a connection point for a |
| connection. Handles can be attached to individual graphicals as |
| well as to their class. |
| |
| link - Defines the generic properties of a connection: the nature (‘kind’) |
| of the handle at either side and the line attributes (arrows, pen |
| and colour). |
| connect - gesture Event-processing object used to connect two |
| graphical objects. |
| |
| Przykład: |
| |
| :- pce_global(@in_out_link, make_in_out_link). |
| |
| make_in_out_link(L) :- |
| new(L, link(in, out, line(arrows := second))). |
| |
| linked_box_demo :- |
| new(P, picture(’Linked Box demo’)), |
| send(P, open), |
| send(P, display, new(B1, box(50,50)), point(20,20)), |
| send(P, display, new(B2, box(25,25)), point(100,100)), |
| send(B1, handle, handle(w, h/2, in)), |
| send(B2, handle, handle(w/2, 0, out)), |
| send_list([B1, B2], recogniser, new(move_gesture)), |
| send(B1, connect, B2, @in_out_link). |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| ==== 5. Projekt:==== |
| |
| Przygotowany plik (na podstawie grafu ard dla termistatu): {{:pl:miw:projekt.pl|projekt.pl}} wprowadzam do SWI-Prolog komendą: "[swi('demo/projekt')].", następnie wpisuję komendę: "projekt.". Wynikiem jest przykładowy graf. Jedynym pomysłem na tworzenie diagramów ARD w XPCE, jest ręczne przygotowanie pliku *.pl, który po załadowaniu wyświetli zawarte w nim informacje. Uproszczeniem procesu tworzenia pliku była by prosty edytor. Aby móc przygotować potrzebny plik musimy widzieć jak tworzyć odpowiednie figury, jak je ze sobą łączyć, w jaki sposób możemy mieć na nie wpływ. |
| |
| Wynikiem moich prób jest następujący graf, składający się z prostokątów połączonych odpowiedni strzałkami (jak w wstępie przykład dla termostatu), użytkownik ma możliwość przesuwania obiektów wciskając i przytrzymując lewy przycisk myszy.: |
| |
| {{:pl:miw:obraz2.png|:pl:miw:obraz2.png}} |
| |
| i jego kod źródłowy: |
| |
| :- pce_global(@in_out_link, make_in_out_link). |
| |
| make_in_out_link(L) :- |
| new(L, link(in, out, line(arrows := second))). |
| projekt :- |
| new(P, picture('Projekt')), |
| send(P, open), |
| send(P, display, new(B1, box(50,50)), point(10,100)), |
| send(P, display, new(B2, box(50,50)), point(100,20)), |
| send(P, display, new(B3, box(50,50)), point(100,100)), |
| send(P, display, new(B4, box(50,50)), point(100,180)), |
| send(P, display, new(B5, box(50,50)), point(190,20)), |
| send(P, display, new(B6, box(50,50)), point(190,100)), |
| send(P, display, new(B7, box(50,50)), point(280,75)), |
| |
| send(B1, handle, handle(w, h/2, in)), |
| send(B2, handle, handle(0, h/2, out)), |
| send(B2, handle, handle(w, h/2, in)), |
| send(B3, handle, handle(0, h/2, out)), |
| send(B3, handle, handle(w, h/2, in)), |
| send(B4, handle, handle(0, h/2, out)), |
| send(B4, handle, handle(w, h/2, in)), |
| send(B5, handle, handle(0, h/2, out)), |
| send(B5, handle, handle(w, h/2, in)), |
| send(B6, handle, handle(0, h/2, out)), |
| send(B6, handle, handle(w, h/2, in)), |
| send(B7, handle, handle(0, h/2, out)), |
| |
| send_list([B1, B3], recogniser, new(move_gesture(left))), |
| send_list([B2, B5], recogniser, new(move_gesture(left))), |
| send_list([B3, B6], recogniser, new(move_gesture(left))), |
| send_list([B4, B6], recogniser, new(move_gesture(left))), |
| send_list([B5, B7], recogniser, new(move_gesture(left))), |
| send_list([B6, B7], recogniser, new(move_gesture(left))), |
| |
| send(B1, connect, B3, @in_out_link), |
| send(B2, connect, B5, @in_out_link), |
| send(B3, connect, B6, @in_out_link), |
| send(B4, connect, B6, @in_out_link), |
| send(B5, connect, B7, @in_out_link), |
| send(B6, connect, B7, @in_out_link). |
| |
| Istnieje również możliwość tworzenia podpisanych obiektów. Można to osiągnąć poprzez podpisanie każdego z nich lub stworzenie tak zwanego "text boxa". Drugie wyjście otrzymujemy w przykładowy sposób: |
| |
| text_box(TB, Text, Width, Height) :- |
| new(TB, device), |
| send(TB, display, |
| new(B, box(Width, Height))), |
| send(TB, display, |
| new(T, text(Text, center, normal))), |
| send(T, center, B?center). |
| |
| Niestety nie udało mi się zintegrować tego typu obiektu z przykładowym grafem. Wadą takiego obiektu jest słaba odporność na zmiany wielkość obiektu oraz aby ja modyfikować należy dość dobrze znać się na strukturze obiektu. |
| |
| Przesuwanie obiektu możemy osiągnąć poprzez przykładową komend: |
| |
| send(B1,x,100), send(B1,y,120). |
| |
| Integrację z użytkownikiem możemy osiągnąć poprzez predykat: |
| |
| send(B1, recogniser, |
| click_gesture(left, '', double, |
| message(@pce, write_ln, hello))). |
| |
| Którego rezultatem jest po dwukrotnym kliknięciu kółka w linii komend pojawi się napis: "hello" tak jak na poniższych obrazkach: |
| |
| przed: |
| |
| {{:pl:miw:obraz3.png|:pl:miw:obraz3.png}} |
| |
| po: |
| |
| {{:pl:miw:obraz4.png|:pl:miw:obraz4.png}} |
| |
| |
| |
| |
| |
| |
| |
| |
| |
== b. Łączenie figur: == | |
| |
== c. Działanie na figurach: == | |
| |
==== 6. Wnioski: ==== | ==== 6. Wnioski: ==== |
| |
| Pierwsze podejście do stworzenia przykładowego grafu podjąłem w systemie Ubuntu 8.04. Po zainstalowaniu z internetu odpowiednich paczek aplikacja nie odpalała się. Mimo prób uzyskania możliwości pracy z prologiem i XPCE pod Linuxem nie otrzymałem żadnych pozytywnych wyników, a brak lepszej znajomości z systemem nie pozwalał mi na rozwiązanie problemu. |
| Drugie podejście podjąłem w bardziej znanym mi środowisku jakim jest Windows XP. Aplikacja działa poprawnie. |
| XPCE nie jest tak proste i przyjazne w użytkowaniu jak może się wydawać na pierwszy rzut oka. Trzeba spędzić dużo czasu zanim się nauczy w nim programować. Jest ono ściśle związane z językiem Prolog, ma duże możliwości lecz stworzenie GUI jest pracochłonne, przy założeniu, że nie zna się jeszcze XPCE. |
| |
| |
| |
* http://www.swi-prolog.org/packages/xpce/ | * http://www.swi-prolog.org/packages/xpce/ |
| |
* https://ai.ia.agh.edu.pl/wiki/pl:prolog:prolog_lab:prolog_lab_xpce | |
| |
* Grzegorz J. Nalepa and Igor Wojnicki. (2008). An ARD+ Design and Visualization Toolchain Prototype in Prolog. | * Grzegorz J. Nalepa and Igor Wojnicki. (2008). An ARD+ Design and Visualization Toolchain Prototype in Prolog. |