/* Création d'un tableau de Karnaugh
   Version 1.00, 5 Avril 1998, © R.Florac */

options results     /* indispensable pour récupérer le résultat des macros */

signal on error     /* pour l'interception des erreurs */
signal on syntax

'ASK("Nombre d''entrées")'; nbe=result
if nbe="" then exit

do i=1 to nbe
    'ASK("Nom de l''entrée 'i'")'; nomE.i=result
end

'ASK("Nom de la sortie")'; nomS=result

'SETSCALE(0,1,1):ROTATE(0,0):SYMMETRY(0,0):DRAWMODE(1)'

nbcases=2**nbe	    /* nombre de cases */
nblignes=nbe%2	    /* nombre de lignes */
nbcol=nbe-nblignes  /* nombre d'entrées situées en haut (horizontal) */

/* Tracé des lignes verticales */
c=(nbe-nbcol)*10+20
l0=10+nbcol*15
l1=l0+(2**nblignes)*30
do col=1 to (2**nbcol)+1
    select
	when col=1 then 'DRAWMODE(2)'
	when col=(2**nbcol)+1 then 'DRAWMODE(2)'
	otherwise 'DRAWMODE(1)'
    end
    'MARK(DRAW('c+col*30','l0','c+col*30','l1'))'
    col.col=c+col*30
end

/* Tracé des lignes horizontales */
c0=(nbe-nbcol)*10+50
c1=c0+((2**nbcol))*30
do i=1 to (2**nblignes)+1
    select
	when i=1 then 'DRAWMODE(2)'
	when i=(2**nblignes)+1 then 'DRAWMODE(2)'
	otherwise 'DRAWMODE(1)'
    end
    'MARK(DRAW('c0','l0','c1','l0'))'
    ligne.i=l0
    l0=l0+30
end

/* Tracé des valeurs d'entrées (horizontales) */
nbval=(2**nbcol)/2
l0=10+nbcol*15
pas=1
do c=1 to nbcol
    if c=nbcol then do
	p=nbval+1
	d=p+nbval
	'MARK(DRAW('col.p','l0-c*10','col.d','l0-c*10'))'
    end
    else do
	p=pas+1
	do while p<=nbval*2
	    r=p+pas*2
	    'MARK(DRAW('col.p','l0-c*10','col.r','l0-c*10'))'
	    p=r+pas*2
	end
	pas=pas*2
    end
end

/* Tracé des valeurs d'entrées (verticales) */
nbval=(2**nblignes)/2
pas=1
do l=1 to nblignes
    if l=nblignes then do
	p=nbval+1
	d=p+nbval
	'MARK(DRAW('col.1-10*l','ligne.p','col.1-10*l','ligne.d'))'
    end
    else do
	p=pas+1
	do while p<=nbval*2
	    r=p+pas*2
	    'MARK(DRAW('col.1-10*l','ligne.p','col.1-10*l','ligne.r'))'
	    p=r+pas*2
	end
	pas=pas*2
    end
end

/* Écriture des repères verticaux */
'ROTATE(0,3):DRAWMODE(1)'
do i=1 to nblignes
    if nomE.i="" then nomE.i='?'
    'MARK(WRITE("'nomE.i'",'col.1-10*i+3','ligne.d+10'+TXHEIGHT("'nomE.i'")))'
    c=c+15
end

/* Écriture des repères horizontaux */
'ROTATE(0,0)'
d=(2**nbcol)+1
do while i<=nbe
    if nomE.i="" then nomE.i='?'
    'MARK(WRITE("'nomE.i'",'col.d+5','ligne.1+4-10*(i-nblignes)'))'
    i=i+1
end

/* Écriture du nom de la sortie */
if nomS="" then nomS="?"
d=d%2+1
p=(2**nblignes)+1
'MARK(WRITE("'nomS'",'col.d'-TXWIDTH("'nomS'")/2,'ligne.p+15'))'

exit

/* Traitement des erreurs, interruption du programme */
syntax:
erreur=RC
'MESSAGE("Script Karnaugh"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'")'
exit

error:
'MESSAGE("Script Karnaugh"+CHR(10)+"Erreur en ligne 'SIGL'")'
exit
