2
3svg_debug:-
4 svg('debug.svg',no,[history,exp,grid]).
5svg_history:-
6 svg('history.svg',anim(4),[history,grid]).
7svg(OutFile,Anim,Options):-
8 open(OutFile,write,Stream),
9 write(Stream,'<?xml version="1.0" encoding="utf-8"?>'), nl(Stream),
10 write(Stream,'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG Tiny 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">'), nl(Stream),
11 write(Stream,'<svg viewBox="0 0 1000 '),
12 write(Stream,1000),
13 write(Stream,'" xmlns="http://www.w3.org/2000/svg">'),nl(Stream),
14 (member(history,Options)
15 -> findall_constraints(h(_,_),History)
16 ; History=[]),
17 (History = [] -> Max = 10 ; maxtime(History,Max)),
18 (Anim=no, member(grid,Options)
19 -> Step is 600/Max, vert_grid(Stream,Max,Step,400)
20 ; true),
21 (Anim = anim(_) -> animated_bar(Stream,Anim) ; true),
22 svg_list(Stream,History,Max,Anim,20,Options),
23 (member(exp,Options)
24 -> findall_constraints(e(_,_),Exp)
25 ; Exp=[]),
26 svg_list(Stream,Exp,Max,Anim,500,Options),
27 write(Stream,'</svg>'),
28 close(Stream).
29
30maxtime([#(h(_,T),_)],T).
31maxtime([#(h(_,T),_)|L],TM):-
32 maxtime(L,TM1),
33 (TM1 > T -> TM=TM1 ; TM=T).
34
35svg_list(_,[],_,_,_,_).
36svg_list(S,[#(h(A,Texp),_)|L],Max,anim(Sec),X1,Options):-
37 38 X2 is X1,
39 write(S,'<text x="'),
40 write(S,X1),
41 write(S,'" y="'),
42 fd_min(Texp,Tmin), fd_max(Texp,Tmax),
43 T is (Tmin+Tmax)/2, Tmin1 is round(Tmin/Max*900), Tmax1 is round(Tmax/Max*900),
44 T1 is round(T*900/Max),
45 T2 is T*Sec/Max,
46 write(S,T1),
47 write(S,'" style="fill:white;stroke:none">H('),
48 write(S,A),
49 write(S,','),
50 write(S,Texp),
51 write(S,')'),
52 write(S,'<set attributeType="CSS" attributeName="fill" to="black" begin="'),
53 write(S,T2),
54 write(S,'s" />'),
55 write(S,'</text>'), nl(S),
56 rectangle(S,X1,X2,Tmin1,Tmax1,green),
57 nl(S),
58 svg_list(S,L,Max,anim(Sec),X2,Options).
59svg_list(S,[#(e(A,Texp),_)|L],Max,anim(Sec),X1,Options):-
60 X0 is X1 - 10,
61 X2 is X1 + 10,
62 63 write(S,'<text x="'),
64 write(S,X2),
65 write(S,'" y="'),
66 fd_min(Texp,Tmin), fd_max(Texp,Tmax),
67 T is (Tmin+Tmax)/2, Tmin1 is round(Tmin/Max*900), Tmax1 is round(Tmax/Max*900),
68 T1 is round(T*900/Max),
69
70 write(S,T1),
71 write(S,'" style="fill:green">E('),
72 write(S,A),
73 write(S,','),
74 write(S,Texp),
75 write(S,')'),
76 77 78 79 80 write(S,'</text>'), nl(S),
81
82 triangle(S,X0,X2,Tmin1,Tmax1,T1,green),
83 nl(S),
84 svg_list(S,L,Max,anim(Sec),X1,Options).
85svg_list(S,[#(Atom,_)|L],Max,no,Y1,Options):-
86 Atom =.. [F,A,Texp],
87 atom_color(F,Col),
88 Y2 is Y1 + 20,
89 Y0 is Y1-20,
90 (member(grid,Options) -> line(S,0,1000,Y1,Y1,lightgray); true),
91 write(S,'<text x="'),
92 write(S,10),
93 write(S,'" y="'),
94 fd_min(Texp,Tmin), fd_max(Texp,Tmax),
95 96 Tmin1 is Tmin/Max*500+400, Tmax1 is Tmax/Max*500+400,
97 98 99 write(S,Y1),
100 write(S,'" style="fill:'), write(S,Col), write(S,';stroke:none">'),
101 write(S,F),
102 write(S,'('),
103 write(S,A),
104 write(S,','),
105 write(S,Texp),
106 write(S,')'),
107 108 109 110 write(S,'</text>'), nl(S),
111 (Tmin1=Tmax1 -> Tmax2 is Tmin1+1; Tmax2 = Tmax1),
112 fd_dom(Texp,Dom),
113 dom_rectangle(S,Dom,400,1000,Max,Y0,Y1,Col),
114 115 nl(S),
116 svg_list(S,L,Max,no,Y2,Options).
117
118animated_bar(S,anim(Sec)):-
119 write(S,'<rect x="0" y="00" width="20" height="900" style="fill:blue;stroke:black" >'),nl(S),
120 write(S,'<animate attributeName="height" from="0" to="900" begin="0s" dur="'),
121 write(S,Sec),
122 write(S,'s" fill="freeze" />'),nl(S),
123 write(S,'</rect>'), nl(S).
124
125rectangle(S,X1,X2,Y1,Y2,Col):-
126 write(S,'<rect x="'), write(S,X1),
127 write(S,'" y="'), write(S,Y1),
128 write(S,'" width="'),
129 Width is X2-X1, write(S,Width),
130 write(S,'" height="'),
131 Height is Y2-Y1, write(S,Height),
132 write(S,'" style="fill:'),
133 write(S,Col),
134 write(S,';stroke:black" >'),nl(S),
138 write(S,'</rect>'), nl(S).
139
140line(S,X1,X2,Y1,Y2,Col):-
141 write(S,'<line x1="'), write(S,X1),
142 write(S,'" y1="'), write(S,Y1),
143 write(S,'" x2="'),
144 write(S,X2),
145 write(S,'" y2="'),
146 write(S,Y2),
147 write(S,'" stroke="'),
148 write(S,Col),
149 write(S,'" />'),nl(S).
150
151atom_color(h,blue).
152atom_color(e,green).
153
154dom_rectangle(S,{Dom},Xmin,Xmax,Max,Y0,Y1,Col):-
155 X is Dom*(Xmax-Xmin)/Max+Xmin,
156 X1 is X+1,
157 rectangle(S,X,X1,Y0,Y1,Col).
158dom_rectangle(S,A..B,Xmin,Xmax,Max,Y0,Y1,Col):-
159 X1 is A*(Xmax-Xmin)/Max+Xmin,
160 X2 is B*(Xmax-Xmin)/Max+Xmin,
161 rectangle(S,X1,X2,Y0,Y1,Col).
162dom_rectangle(S,A\/B,Xmin,Xmax,Max,Y0,Y1,Col):-
163 dom_rectangle(S,A,Xmin,Xmax,Max,Y0,Y1,Col),
164 dom_rectangle(S,B,Xmin,Xmax,Max,Y0,Y1,Col).
165
166triangle(S,X1,X2,Tmin1,Tmax1,Texp,Col):-
167 write(S,'<path d="M'), write(S,X1), write(S,' '), write(S,Tmin1),
168 write(S,'V'), write(S,Tmax1),
169 write(S,'L'), write(S,X2), write(S,' '), write(S,Texp), write(S,'Z" fill="'),
170 write(S,Col), write(S,'" stroke="black" opacity=".7" />'), nl(S).
171
172:- multifile user:debugger_command_hook/2. 173user:debugger_command_hook(unknown([115,118,103],_), Actions) :- 174 Actions = [],
175 svg('debug.svg',no,[history,exp,grid]).
176
177vert_grid(_,0,_,_):- !.
178vert_grid(S,N,Step,Xmin):-
179 X is N*Step+Xmin,
180 line(S,X,X,0,1000,lightgray),
181 write(S,'<text x="'), write(S,X), write(S,'" y="980" stroke="lightgray">'),
182 write(S,N), write(S,'</text>'), nl(S),
183 N1 is N-1,
184 vert_grid(S,N1,Step,Xmin)