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).
Przygotowany plik (na podstawie grafu ard dla termistatu): 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.:
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 komendę:
send(B1, recogniser,
click_gesture(left, '', double,
message(@pce, write_ln, hello))).
Dodatkowo nie udało mi się jeszcze, że podwójne kliknięcie spowoduje wywołanie predykatu zadanego predykatu.