Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:miw:miw08_prolog_ardxpce [2008/09/29 00:06]
miw
pl:miw:miw08_prolog_ardxpce [2019/06/27 15:50] (aktualna)
Linia 32: Linia 32:
  
  
-==== 1. Wstęp: ==== 
  
-=== a. Środowisko pracy: === 
  
  
-Wszystkie przykłady tworzone i testowane były w systemie Ubuntu. 
  
-=== b. Oprogramowanie: ===+==== 1. Wstęp====
  
 +== a. Środowisko pracy: ==
  
-== i. SWI-Prolog ​==+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:​ ==
  
-== ii. XPCE ​==+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.
  
-==== 2. Biblioteka XPCE w Prologu: ​====+== 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. ​
  
-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.  +== d. Konstrukcja grafów ARD (Atribute Relationship Diagram): ==
- +
- +
- +
- +
- +
- +
- +
- +
-==== 3. 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:​
Linia 70: Linia 60:
  
 ==== 4. Wiadomości wstępne o XPCE: ==== ==== 4. Wiadomości wstępne o XPCE: ====
- 
  
 Jednymi z ważniejszych predykatów wykorzystywania XPCE w Prologu są: Jednymi z ważniejszych predykatów wykorzystywania XPCE w Prologu są:
  
 == a. Tworzenie obiektów NEW: == == 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. new(?​Reference,​ +NewTerm) – tworzy obiekt oraz przypisuje do niego dana referencję,​ która jest wykorzystywana do komunikacji pomiędzy obiektami.
Linia 83: Linia 71:
  
 == b. Modyfikacja stanu obiektów SEND: == == 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. 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.
Linia 91: Linia 78:
  
 == c. Zapytanie do Obiektów GET: == == 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ść. Służy do pobierania informacji o stanie obiektu. Dwa pierwsze argumentu są podobne jak w predykacie SEND, trzeci zwraca wartość.
Linia 99: Linia 85:
  
 == d. Niszczenie obiektów FREE: == == d. Niszczenie obiektów FREE: ==
- 
  
 Argumentem jest referencja na obiekt (stworzona przy użyciu NEW i GET). Predykat usuwa obiekt. Argumentem jest referencja na obiekt (stworzona przy użyciu NEW i GET). Predykat usuwa obiekt.
Linia 106: Linia 91:
  ?​-free(@demo).  ?​-free(@demo).
  
-==== 5====+== eTworzenie 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}}
 +
 +
 +
 +
 +
 +
 +
 + 
 +
 +
 +
 +
 ==== 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.
  
  
Linia 125: Linia 309:
  
   * 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.
pl/miw/miw08_prolog_ardxpce.1222639590.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0