1% blah
    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    %X2 is X1 + 10,
   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    %X2 is X1,
   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    %T2 is T*Sec/Max,
   77    %write(S,'<set attributeType="CSS" attributeName="fill" to="black" begin="'),
   78    %write(S,T2),   Animation
   79    %write(S,'s" />'),
   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    %T is (Tmin+Tmax)/2, 
   96    Tmin1 is Tmin/Max*500+400, Tmax1 is Tmax/Max*500+400,
   97    %T1 is T*500/Max,
   98    %T2 is T*Sec/Max,
   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    %write(S,'<set attributeType="CSS" attributeName="fill" to="black" begin="'),
  108    %write(S,T2),
  109    %write(S,'s" />'),
  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    % rectangle(S,Tmin1,Tmax2,Y0,Y1,Col),
  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),
  135%    write(S,'<animate attributeName="height" from="0" to="500" begin="0s" dur="'),
  136%    write(S,Sec),
  137%    write(S,'s" fill="freeze" />'),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) :- % Command: svg
  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)