include "GrapDecl.PRO"

CONSTANTS       
  intlist = BGI_ilist
    bgi_Path = "c:\\xt\\tc\\bgi\\"
Domains
	file=entrada;salida
	list_integer=integer *
	llist_integer=list_integer *
	list_char=char *

/************************************************************************
		Local data base
*************************************************************************/

Database - graphics
  Determ driver(Integer,Integer,String)
  Determ maxcolors(Integer)
  Determ maxX(Integer)
  Determ maxY(Integer)
  Determ aspectCorr(Real)
  Determ graphCoord(Integer,Integer)
  Determ lineStyleDBA(Integer,Integer,Integer)
  Determ textHeightDBA(Integer)

/************************************************************************
		Return name of driver
*************************************************************************/

PREDICATES

  GetDriverName2(Integer,String) 

CLAUSES
  GetDriverName2(0,"Detect").   GetDriverName2(1,"CGA").
  GetDriverName2(2,"MCGA").     GetDriverName2(3,"EGA").
  GetDriverName2(4,"EGA64").    GetDriverName2(5,"EGAMono").
  GetDriverName2(6,"Reserved"). GetDriverName2(7,"HercMono").
  GetDriverName2(8,"ATT400").   GetDriverName2(9,"VGA").
  GetDriverName2(10,"PC3270").

/************************************************************************
	Convert the current device mode into a string
*************************************************************************/

PREDICATES
  GetMode(Integer,Integer,String)

CLAUSES
  GetMode(cga,cgaHi,"CGAHi"):-!.
  GetMode(cga,GraphMode,S):- !,format(S,"CGA%",GraphMode).
  GetMode(mcga,mcgaMed,"MCGAMed"):- !.
  GetMode(mcga,mcgahi,"MCGAHi"):- !.
  GetMode(mcga,GraphMode,S):- !,format(S,"MCGA%",GraphMode).
  GetMode(ega,egaLo,"EGALo"):- !.
  GetMode(ega,egaHi,"EGAHi"):- !.
  GetMode(ega64,ega64Lo,"EGA64Lo"):- !.
  GetMode(ega64,ega64Hi,"EGA64Hi"):- !.
  GetMode(hercMono,_,"HercMonoHi"):- !.
  GetMode(egaMono,_,"EGAMonoHi"):- !.
  GetMode(pc3270,_,"PC3270Hi"):- !.
  GetMode(att400,att400Med,"ATT400Med"):- !.
  GetMode(att400,att400Hi,"ATT400Hi"):- !.
  GetMode(att400,GraphMode,S):- !,format(S,"ATT400%",GraphMode).
  GetMode(vga,vgaLo,"VGALo"):- !.
  GetMode(vga,vgaMed,"VGAMedo"):- !.
  GetMode(vga,vgaHi,"VGAHi"):- !.
  GetMode(_,_,"UnKnown"):- !.

/************************************************************************
		Mode switching
*************************************************************************/

PREDICATES
  ToGraphic
  ToText
  KeepColor(integer,integer,integer)

CLAUSES
  ToGrapHic:-
	/* Detect graphic equipment */
	DetectGraph(G_Driver, G_Mode1),
	KeepColor(G_Driver,G_Mode1,G_Mode),
	GetDriverName2(G_Driver,G_Name),
	assert(driver(G_Driver,G_Mode,G_Name)),
	InitGraph(G_Driver,G_Mode, _, _, bgi_Path),!.

  ToText:-
	closegraph().
	
KeepColor(1,_,0).
KeepColor(_,Mode,Mode).

/************************************************************************
		Initialize video and Global flags
*************************************************************************/

PREDICATES
  Initialize

CLAUSES
  Initialize:-
	retractall(_, graphics),
	ToGraphic,
	GetMaxColor(MaxColors),   assert(maxcolors(MaxColors)),
	GetMaxX(MaxX),    assert(maxX(MaxX)),
	GetMaxY(MaxY),    assert(maxY(MaxY)),
	GetAspectRatio(Xasp,Yasp),
	AspectRatio = Xasp/Yasp,  assert(aspectCorr(AspectRatio)).

/************************************************************************
		Mi c¢digo al fin...
*************************************************************************/

include "dibuja.pro"
include "interact.pro"

Predicates
	error(integer)
	abre_lect(string)
	abre_escr(string)
	lee_archivo(llist_integer,llist_integer)
	genera(char)
	generar
	char_real(char,real)
	real_char(real,char)
	menu(char)
Goal        
	    menu('0').
Clauses                                           
	
	menu('\27'):-exit.
	menu('1'):-makewindow(31,31,30,"Archivo a Guardar:",10,15,5,54),write("\nDame el nombre del archivo donde se salvar  "),
		readln(FileName),abre_escr(FileName),
		genera(1),!,removewindow(),menu('0').  
	menu('2'):-makewindow(31,31,30,"Archivo a Guardar:",10,15,5,54),write("\nDame el nombre del archivo donde se salvar  "),
		readln(FileName),abre_escr(FileName),
		generar,!,removewindow(),menu('0').  
	menu('3'):-makewindow(31,31,30,"",8,10,11,65),
		trap(dir("","*.",FileName,1,1,1),E,error(E)),FileName<>"",
		abre_lect(FileName),lee_archivo([],Coor),
		Initialize,interac(Coor,45,'4','1','5'),ToText,removewindow(),!,menu('0').
	menu('4'):-file_str("manusu.txt",Str),makewindow(32,112,126,"Manual del Usuario",1,1,23,77),
		clearwindow,EditMode=0,Indent=0,Insert=1,TextMode=1,
		edit(Str,_," ","manusu.txt","ESC para salir",0,"",EditMode,Indent,Insert,TextMode,_,_),
		removewindow(),menu('0').
	menu('5'):-file_str("mantec.txt",Str),makewindow(32,112,126,"Manual T‚cnico",1,1,23,77),
		clearwindow,EditMode=0,Indent=0,Insert=1,TextMode=1,
		edit(Str,_," ","mantec.txt","ESC para salir",0,"",EditMode,Indent,Insert,TextMode,_,_),
		removewindow(),menu('0').

	menu(_):-makewindow(31,31,30,"Visualizador Tridimensional",8,10,13,66),
		write("\n1 Generar una gr fica tridimensional modificable en \"genera(A)\"."),
		write("\n2 Generar una gr fica tridimensional modificable en \"generar\".  "),
		write("\n3 Visualizar una gr fica tridimensional (F1-Help)."),
		write("\n\n4 Manual del Usuario."),
		write("\n\n5 Manual T‚cnico."),
		write("\n						ESC para salir"),
		readchar(I),removewindow(),!,menu(I).  
	
	error(_).
	
	char_real(X,A):-char_int(A,H),X=10*(H/10).
	real_char(X,A):-H=10*(X/10),char_int(A,H).
	
	abre_lect(FileName):-openread(entrada,FileName),filemode(entrada,0).
	
	abre_escr(FileName):-not(ExistFile(FileName)),openwrite(salida,FileName),filemode(salida,0).
	abre_escr(FileName):-openappend(salida,FileName),filemode(salida,0).
	
	generar:-writedevice(salida),
		
		write('\4','\0','\167'),
		write('\12','\0','\168'),
		write('\14','\0','\170'),
		write('\14','\0','\227'),
		write('\12','\0','\228'),
		write('\4','\0','\229'),
		write('\4','\0','\233'),
		write('\28','\0','\233'),
		write('\28','\0','\230'),
		write('\71','\67','\169'),
		write('\71','\67','\244'),
		write('\68','\67','\247'),
		write('\56','\67','\248'),
		write('\56','\67','\255'),
		write('\98','\67','\255'),
		write('\98','\67','\248'),
		write('\86','\67','\247'),
		write('\82','\67','\244'),
		write('\82','\67','\148'),
		write('\69','\67','\148'),
		write('\22','\0','\222'),
		write('\22','\0','\170'),
		write('\24','\0','\168'),
		write('\32','\0','\167'),
		write('\32','\0','\163'),
		write('\4','\0','\163'),
		write('\4','\6','\167'),
		write('\12','\6','\168'),
		write('\14','\6','\170'),
		write('\14','\6','\227'),
		write('\12','\6','\228'),
		write('\4','\6','\229'),
		write('\4','\6','\233'),
		write('\28','\6','\233'),
		write('\28','\6','\230'),
		write('\71','\74','\169'),
		write('\71','\74','\244'),
		write('\68','\74','\247'),
		write('\56','\74','\248'),
		write('\56','\74','\255'),
		write('\98','\74','\255'),
		write('\98','\74','\248'),
		write('\86','\74','\247'),
		write('\82','\74','\244'),
		write('\82','\74','\148'),
		write('\69','\74','\148'),
		write('\22','\6','\222'),
		write('\22','\6','\170'),
		write('\24','\6','\168'),
		write('\32','\6','\167'),
		write('\32','\6','\163'),
		/*write('\4','\6','\163'),*/
		
		closefile(salida),writedevice(screen),!.
		
	genera(256):-closefile(salida),writedevice(screen),!.
	genera(A):-writedevice(salida),
		char_real(X,A),Y=127+127*cos(2*2*3.1415*(1-X/255)),
		real_char(Y,B),Z=127+127*sin(4*2*3.1415*(1-X/255)),
		real_char(Z,C),
		write(A,B,C),
		D=A+1,!,genera(D).
			
	lee_archivo(Van,Coor):-readdevice(entrada),not(eof(entrada)),
		readchar(X),char_int(X,A),readchar(Y),char_int(Y,B),
		readchar(Z),char_int(Z,C),Coor1=[[A,B,C]|Van],!,
		lee_archivo(Coor1,Coor).
	lee_archivo(Coor,Coor):-closefile(entrada).

    Source: geocities.com/v.iniestra/apuntes/pro_log

               ( geocities.com/v.iniestra/apuntes)                   ( geocities.com/v.iniestra)