Both sides previous revision
Poprzednia wersja
|
|
pl:miw:miw08_prolog_ardxpce [2008/10/05 15:23] miw |
pl:miw:miw08_prolog_ardxpce [2008/10/05 17:13] miw |
====== Opis ====== | |
Wojciech Franczak, <wojciech.franczak@gmail.com>, | |
| |
ARD visualization and interactive, shell-based editing, w/ vis. in XPCE (VARDA shell) | |
| |
| |
====== Spotkania ====== | |
| |
===== 08.02.19 ===== | |
Przydzielenie projektu, wstępne omówienie tematu. | |
| |
===== 08.03.04 ===== | |
| |
Pytania: | |
| |
1. pytanie dotyczące aplikacji którą pokazywał Pan na pierwszym spotkaniu (jak działa i jak ja zainstalować, i jak wygląda od środka)? | |
| |
2. czy w razie problemów mogę się zgłaszać do Pana? | |
| |
===== 08.03.18 ===== | |
* generowanie prostych grafów skierowanych w XPCE | |
* możliwość edycji, sprzężenie zwrotne, t.j. klikam na węźle, krawędzi -> odpala predykat w prologu, callback | |
| |
| |
===== 08.04.01 ===== | |
* generowanie ARD w XPCE z [[hekate:varda]] | |
| |
| |
| |
====== Sprawozdanie ====== | |
| |
| |
| |
| |
| |
| |
| |
==== 1. Wstęp: ==== | |
| |
== a. Środowisko pracy: == | |
| |
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. | |
| |
== 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. | |
| |
== c. Biblioteka XPCE w Prologu: == | |
| |
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: | |
| |
{{:pl:miw:oraz1.png|:pl:miw:oraz1.png}} | |
| |
| |
| |
| |
==== 4. Wiadomości wstępne o XPCE: ==== | |
| |
Jednymi z ważniejszych predykatów wykorzystywania XPCE w Prologu są: | |
| |
== a. Tworzenie obiektów NEW: == | |
| |
new(?Reference, +NewTerm) – tworzy obiekt oraz przypisuje do niego dana referencję, która jest wykorzystywana do komunikacji pomiędzy obiektami. | |
| |
Przykład: | |
?- new(@demo, dialog(‘Okno Dialogowe’)). – tworzy okno dialogowe, w którym umieszcza się napisy, przyciski, itp. | |
| |
== b. Modyfikacja stanu obiektów SEND: == | |
| |
send(+Receiver, +Selector(..Argumenty..)). – za pomocą tej komendy dokonuje się zmiany stanu obiektów. Pierwszy argument tego predykatu jest referencją do obiektu, natomiast drugi to term, którego nazwa jako funktor jest nazwą metody do wywołania, a argumenty są argumentami operacji. | |
| |
Przykład: | |
?- send (@demo, append(text_item(Nazwa)). – wywołuje metodę append klasy dialog, dodaje komponent do okna dialogowego. | |
| |
== c. Zapytanie do Obiektów GET: == | |
| |
Służy do pobierania informacji o stanie obiektu. Dwa pierwsze argumentu są podobne jak w predykacie SEND, trzeci zwraca wartość. | |
| |
Przykład: | |
?- get(@demo, display, D). – zwraca obiekt display, na którym @demo jest wyświetlane. | |
| |
== d. Niszczenie obiektów FREE: == | |
| |
Argumentem jest referencja na obiekt (stworzona przy użyciu NEW i GET). Predykat usuwa obiekt. | |
| |
Przykład: | |
?-free(@demo). | |
| |
== e. Tworzenie figur: == | |
| |
arrow - Służy do tworzenia strzałek. | |
| |
bezier - Tworzy krzywe Bezier`a. | |
| |
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. | |
| |
path - Wielo linia przechodząca przez kilka punktów. | |
| |
text - Służy do wyświetlania tekstu. | |
Przykład: | |
| |
?- send(@p, display, | |
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}} | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
<del>Dodatkowo nie udało mi się jeszcze, że podwójne kliknięcie spowoduje wywołanie predykatu zadanego predykatu.</del> | |
| |
| |
==== 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. | |
| |
| |
====== Materiały ====== | |
| |
* {{:pl:miw:referat.pdf|:pl:miw:referat.pdf}} - referat kolegi na temat XPCE, | |
| |
* {{:pl:miw:userguide.pdf|:pl:miw:userguide.pdf}} - opis XPCE, | |
| |
* http://www.hio.hen.nl/faq/xpce-programming.html - przydatne informacje o XPCE (5.05.2008) | |
| |
* http://www.urz.uni-heidelberg.de/UnixCluster/Hinweise/Hilfe/Anwendung/Compiler/Prolog/UserGuide/Contents.html (7.05.2008) | |
| |
* http://gollem.science.uva.nl:8080/ | |
| |
* http://www.swi-prolog.org/packages/xpce/ | |
| |
* Grzegorz J. Nalepa and Igor Wojnicki. (2008). An ARD+ Design and Visualization Toolchain Prototype in Prolog. | |
| |
* Nalepa, G. J. (2008). UServ Case Study, Conceptual Design with ARD+ Method. Paper presented at the FLAIRS-21: Proceedings of the twenty-first international Florida Artificial Intelligence Research Society conference: 15--17 may 2008, Coconut Grove, Florida, USA, Menlo Park, California. | |
| |
* Nalepa, G. J., & Wojnicki, I. (2008). Towards Formalization of ARD+ Conceptual Design and Refinement Method. Paper presented at the FLAIRS-21: Proceedings of the twenty-first international Florida Artificial Intelligence Research Society conference: 15--17 may 2008, Coconut Grove, Florida, USA, Menlo Park, California. | |
| |
| |