(*************************************************************)
(* Fecha de £ltima modificaci¢n   : __ de __________ de 1992 *)
(* Modificado por                 : Ren‚ A. Rodr¡guez Gzz.   *)
(* Explicacion                    : Rutinas para Graficar    *)
(*                                                           *)
(*************************************************************)

unit SGGrafbk;

Interface

uses Crt, Printer, Graph, SGMouse, SGVarsbk, SGUtilbk, SGPrinbk;

Procedure Grafica;

Procedure MensajeInicio;

Procedure MensajeVariable;

Procedure MensajeFin;

Procedure Datos_A_Valor;

Procedure CalculaEscala;

Implementation

Var
 ViewInfo      : ViewPortType;
 CtlVal        : Array [1..6] Of Real;
 XStp, YStp    : Real;
 YTics         : Integer;

Procedure Datos_A_Valor;
Var I, Code : Integer;
Begin
 FillChar (Valor^, SizeOf(Valor^), Null);
 Valor^.Fecha := Copy(Datos^.Fecha,7,2)+'/'+Copy(Datos^.Fecha,5,2)+'/'+Copy(Datos^.Fecha,3,2);
 Valor^.Hora  := Copy(Datos^.Hora,1,2)+':'+Copy(Datos^.Hora,3,2)+':'+Copy(Datos^.Hora,5,2);
 Val (Datos^.TC_Pos,         Valor^.TC_Pos,         Code);
 Val (Datos^.TC_Neg,         Valor^.TC_Neg,         Code);
 Val (Datos^.TL_Pos,         Valor^.TL_Pos,         Code);
 Val (Datos^.TL_Neg,         Valor^.TL_Neg,         Code);
 Val (Datos^.Cal_Nominal,    Valor^.Cal_Nominal,    Code);
 Val (Datos^.Cal_Promedio,   Valor^.Cal_Promedio,   Code);
 Val (Datos^.Ancho,          Valor^.Ancho_Nominal,  Code);
 Val (Datos^.Promedio[1],    Valor^.Promedio[1],    Code);
 Val (Datos^.Promedio[2],    Valor^.Promedio[2],    Code);
 Val (Datos^.Promedio[3],    Valor^.Promedio[3],    Code);
 Val (Datos^.Promedio[4],    Valor^.Promedio[4],    Code);
 Val (Datos^.Limite_Grafica, Valor^.Limite_Grafica, Code);
 Val (Datos^.Longitud,       Valor^.Longitud,       Code);
 Val (Datos^.Num_Muestras,   Valor^.Num_Muestras,   Code);
 Val (Datos^.Distancia,      Valor^.Distancia,      Code);
 Val (Datos^.Mil_ZS_RF,      Valor^.Mil_ZS_RF,      Code);
 Val (Datos^.Valor_Nominal,  Valor^.Valor_Nominal,  Code);
 Val (RegConfig.Segs_wait,   Valor^.Segs_wait,      Code);

 If ( Datos^.Elemento_Cert = '1' ) then
 Begin
    Val (Datos^.Valor_Promedio,  Valor^.Valor_Promedio,  Code);
    Valor^.Lim_Superior_TC  := Valor^.Valor_Nominal + Valor^.TC_Pos;
    Valor^.Lim_Inferior_TC  := Valor^.Valor_Nominal - Valor^.TC_Neg;
    Valor^.Lim_Superior_TL  := Valor^.Valor_Nominal + Valor^.TL_Pos;
    Valor^.Lim_Inferior_TL  := Valor^.Valor_Nominal - Valor^.TL_Neg;
    Valor^.Lim_Superior_ZS  := Valor^.Lim_Superior_TC + Valor^.Mil_ZS_Rf;
    Valor^.Lim_Inferior_ZS  := Valor^.Lim_Inferior_TC - Valor^.Mil_ZS_RF;
 end;
 If ( Datos^.Elemento_Cert = '2' ) then
 Begin
    Val (Datos^.Valor_Promedio,  Valor^.Valor_Promedio,  Code);
    Valor^.Lim_Superior_TC  := Valor^.Valor_Nominal + Valor^.TC_Pos;
    Valor^.Lim_Inferior_TC  := Valor^.Valor_Nominal - Valor^.TC_Pos;
    Valor^.Lim_Superior_TL  := Valor^.Lim_Superior_TC;
    Valor^.Lim_Inferior_TL  := Valor^.Lim_Inferior_TC;
    Valor^.Lim_Superior_ZS  := Valor^.Lim_Superior_TC;
    Valor^.Lim_Inferior_ZS  := Valor^.Lim_Inferior_TC;
 end;
 If ( Datos^.Elemento_Cert = '3' ) then
 Begin
    Valor^.Valor_Promedio   := Valor^.Ancho_Nominal + Valor^.Promedio[4];
    Str(Valor^.Valor_Promedio, Datos^.Valor_Promedio);
    Valor^.Prom[1]   := Valor^.Ancho_Nominal + Valor^.Promedio[1];
    Str(Valor^.Prom[1], Datos^.Prom[1]);
    Valor^.Prom[2]   := Valor^.Ancho_Nominal + Valor^.Promedio[2];
    Str(Valor^.Prom[2], Datos^.Prom[2]);
    Valor^.Prom[3]   := Valor^.Ancho_Nominal + Valor^.Promedio[3];
    Str(Valor^.Prom[3], Datos^.Prom[3]);
    Valor^.Prom[4]   := Valor^.Ancho_Nominal + Valor^.Promedio[4];
    Str(Valor^.Prom[4], Datos^.Prom[4]);
    Valor^.Lim_Superior_TC  := Valor^.Valor_Nominal + Valor^.TC_Pos;
    Valor^.Lim_Inferior_TC  := Valor^.Valor_Nominal - Valor^.TC_Pos;
    Valor^.Lim_Superior_TL  := Valor^.Lim_Superior_TC;
    Valor^.Lim_Inferior_TL  := Valor^.Lim_Inferior_TC;
    Valor^.Lim_Superior_ZS  := Valor^.Lim_Superior_TC;
    Valor^.Lim_Inferior_ZS  := Valor^.Lim_Inferior_TC;
 end;

 If Valor^.Num_Muestras >= 400 then Valor^.num_muestras := 399;

 For I := 1 To Valor^.Num_Muestras Do
 Val (Datos^.Muestras[I],      Valor^.Muestras[I],       Code);

 Val (Datos^.Inicio_Cpo1,      Valor^.Inicio_Cpo1,       Code);
 Val (Datos^.Final_Cpo1,       Valor^.Final_Cpo1,        Code);
 Val (Datos^.Soldadura,        Valor^.Soldadura,         Code);
 Val (Datos^.Inicio_ZS,        Valor^.Inicio_ZS,         Code);
 Val (Datos^.Fin_ZS,           Valor^.Fin_ZS,            Code);
 Val (Datos^.Inicio_Rampa_Fin, Valor^.Inicio_Rampa_Fin,  Code);
 Val (Datos^.Fin_Rampa_Ini,    Valor^.Fin_Rampa_Ini,     Code);

 Valor^.Inicio_Cpo1       := Valor^.Inicio_Cpo1 * Valor^.Distancia;
 Valor^.Final_Cpo1        := Valor^.Final_Cpo1 * Valor^.Distancia;
 Valor^.Soldadura         := Valor^.Soldadura * Valor^.Distancia;
 Valor^.Fin_ZS            := Valor^.Fin_ZS * Valor^.Distancia;
 Valor^.Inicio_ZS         := Valor^.Inicio_ZS * Valor^.Distancia;
 Valor^.Inicio_Rampa_Fin  := Valor^.Inicio_Rampa_Fin * Valor^.Distancia;
 Valor^.Fin_Rampa_Ini     := Valor^.Fin_Rampa_Ini * Valor^.Distancia;


 If Datos^.Elemento_Cert = '3' then
 Begin
    For I := 1 To Valor^.Num_Muestras Do
      Begin
        If Valor^.Muestras[I] > 5000 then
           Valor^.Muestras[I] :=  Valor^.Ancho_Nominal - (Valor^.Muestras [I] - 5000)
        else
           Valor^.Muestras[I] :=  Valor^.Muestras[I] + Valor^.Ancho_Nominal;
      end;
 End;

End; { Datos_a_Valor }

Function SignR (Param: Real) : Integer;
Begin
 If Param > 0 Then SignR:= 1;
 If Param < 0 Then SignR:=-1;
 If Param = 0 Then SignR:= 0;
End; { SignR }

Function Log (Param, BASE: Real) : Real;
Begin
 Log := LN(Param) / LN(BASE);
End; { Log }

Function Ifs (Param: Boolean) : Integer;
Begin
 If Param Then Ifs := 1
          Else Ifs := 0;
End; { Ifs }

Function Potencia (Param, Exponente: Real) : Real;
Begin
 If Exponente = 0 Then Potencia := 1
                  Else Potencia := EXP(Exponente * LN(Param));
End; { Potencia }

Function IAB (Param: Real) : Real;
Begin
 IAB := INT(ABS(Param));
End; { IAB }

Procedure CalculaEscala;
Var   Esn, Esnal:Real;
Begin
 If Max > Min Then Esn := DX(Max, Min)
              Else Esn := DX(Min, Max);
 If (Max=Min) Then
 Begin
  Max:=1;
  Min:=0;
 End;
 Esnal:= (-1*Ifs(((Max-Min)/7)<1)) + (SignR(Log(((Max-Min)/7),10)) *
                     IAB(Log(((Max-Min)/7),10)));
 Esn  := (((Max-Min)/7)/Potencia(10,Esnal));
 If Esn < 1.414214                     Then Esv[3] :=    Potencia(10,Esnal);
 If (Esn>=1.414214) AND (Esn<3.162278) Then Esv[3] :=  2*Potencia(10,Esnal);
 If (Esn>=3.162278) AND (Esn<7.071068) Then Esv[3] :=  5*Potencia(10,Esnal);
 If (Esn>=7.071068)                    Then Esv[3] := 10*Potencia(10,Esnal);
 Esn    := (SignR(Min/Esv[3])*IAB(Min/Esv[3])) - Ifs(0>(Min/Esv[3]));
 Esv[1] := Esv[3] * (Esn + Ifs((Esn+1-(Min/Esv[3]))<0.00002));
 Esn    := (SignR(Max/Esv[3]) * IAB(1+(Max/Esv[3]))) - Ifs(-1>(Max/Esv[3]));
 Esv[2] := Esv[3] * (Esn - Ifs(((Max/Esv[3])+1-Esn)<0.00002));
 YTics:=TRUNC(ROUND((Esv[2]-Esv[1])/Esv[3]));
End; { CalculaEscala }

Procedure Linea (CordX,CordY,Tipo,Patron,Anch:Word;Color:Byte);
Begin
  SetColor(CualColor(1,Color));
  SetLineStyle(Tipo,Patron,Anch);
  Line(CordX,CordY,CordX+20,CordY);
  SetColor(CualColor(1,$0F));
End;

Procedure Encabezado_Pla;
Begin
  SetTextStyle(DefaultFont, HorizDir, 1); Ancho := 8;
  OutTextXY( 1*Ancho, 1*Alto, 'HYLSA   CERTIFICADO DE CALIDAD');
  OutTextXY(03*Ancho, 9*Alto, 'PLANEZA(i)');
  OutTextXY(35*Ancho, MaxY-9*Alto, 'M E T R O S');
 { OutTextXY((10+(40-Length(Datos^.Titulo_Graf_2)) div 2)*Ancho, 4*Alto,
                           Datos^.Titulo_Graf_2);}
  OutTextXY((20+(40-Length(Datos^.Titulo_Grafica)) div 2)*Ancho, 6*Alto,
                              Datos^.Titulo_Grafica);

  SetTextStyle(SmallFont, HorizDir, 4); Ancho:=6;
  OutTextXY(5*Ancho, 3*Alto, 'Secuencia  :'+Datos^.Secuencia_Int);
  OutTextXY(5*Ancho, 4*Alto, 'Pedido     :'+Datos^.Num_Pedido);
  If Datos^.Presentacion[1] = 'P' Then
       OutTextXY(26*Ancho, 3*Alto, 'Paquete:'+Datos^.Num_Paq_Int+' '+Datos^.Lta_Paq_Int);
  If Datos^.Tipo_Grafica = 'C' Then
    Begin
      OutTextXY(53*Ancho, 1*Alto, 'Cte:'+Datos^.Num_Cliente);
      OutTextXY(65*Ancho, 1*Alto, Datos^.Nom_Cliente);
    End;
  OutTextXY(88*Ancho, 3*Alto, 'Calidad :'+Datos^.Calidad);
  OutTextXY(88*Ancho, 4*Alto, 'Tolerancia : '+Datos^.Tolerancia);
  OutTextXY(88*Ancho, 5*Alto, 'Acabado    :'+Datos^.Acabado);
  OutTextXY(88*Ancho, 6*Alto, 'Tipo Prod  :'+Datos^.Tipo_Producto);
  If Datos^.Tipo_Grafica = 'I' Then
   begin
     SetTextStyle(SmallFont, HorizDir, 5); Ancho:=6;
     OutTextXY(35*Ancho, 3*Alto, 'Datos del Molino Caliente');
     SetTextStyle(SmallFont, HorizDir, 4); Ancho:=6;
     OutTextXY(20*Ancho, 6*Alto, 'Cal. Insp.');
     OutTextXY(20*Ancho, 7*Alto, 'Planeza :');
     OutTextXY(20*Ancho, 8*Alto, 'Calibre :'+Datos^.Calibre);
     OutTextXY(20*Ancho, 9*Alto, 'Ancho   :'+Datos^.Ancho);
     OutTextXY(88*Ancho, 8*Alto, 'Proceso :'+Datos^.Proceso);
     OutTextXY(88*Ancho, 9*Alto, 'Orilla  :'+Datos^.Orilla);
     OutTextXY(88*Ancho,10*Alto, 'Acero   :'+Datos^.Acero);
   end;
  OutTextXY(40*Ancho, 4*Alto, 'PLANEZA(i)   Nom.  Prom.');
  OutTextXY(42*Ancho, 5*Alto, 'Orilla-N : ');
  OutTextXY(42*Ancho, 6*Alto, 'Cuarto-N : ');
  OutTextXY(42*Ancho, 7*Alto, 'Centro   : ');
  OutTextXY(42*Ancho, 8*Alto, 'Cuarto-S : ');
  OutTextXY(42*Ancho, 9*Alto, 'Orilla-S : ');
  
end;

{ Rutina que imprime los encabezados de las graficas para CALIBRE y ANCHO}
Procedure Encabezados;
Begin
 SetColor (CualColor(1,$0F));
 With CurrentScr Do
 Begin
  if Datos^.Elemento_Cert <> '4' then
  begin
    SetTextStyle(SmallFont, HorizDir, 4); Ancho:=6;
    OutTextXY(86*Ancho, 0*Alto, 'Remision:    '+Datos^.Num_Remision);
    OutTextXY( 7*Ancho, 3*Alto, 'Sec. Interna:'+Datos^.Secuencia_Int);
    If Datos^.Presentacion[1] = 'P' Then
       OutTextXY(26*Ancho, 3*Alto, 'Paquete:'+Datos^.Num_Paq_Int+' '+Datos^.Lta_Paq_Int);
    If Datos^.Secuencia_Ext <> '000000'  Then
       OutTextXY( 7*Ancho, 2*Alto, 'Sec. Externa:'+Datos^.Secuencia_Ext);
    If Datos^.Tipo_Grafica = 'C' Then
      Begin
        OutTextXY(53*Ancho, 1*Alto, 'Cte:'+Datos^.Num_Cliente);
        OutTextXY(65*Ancho, 1*Alto, Datos^.Nom_Cliente);
      End;
    OutTextXY(53*Ancho, 2*Alto, 'Pedido :'+Datos^.Num_Pedido);
    OutTextXY(68*Ancho, 2*Alto, 'Tipo Prod:'+Datos^.Tipo_Producto);
    OutTextXY(88*Ancho, 2*Alto, 'Tolerancia: '+Datos^.Tolerancia);
    OutTextXY(53*Ancho, 3*Alto, 'Calibre:'+Datos^.Calibre);
    OutTextXY(68*Ancho, 3*Alto, 'Ancho    :'+Datos^.Ancho);
    OutTextXY(88*Ancho, 3*Alto, 'Acabado   :'+Datos^.Acabado);
    OutTextXY(53*Ancho, 4*Alto, 'Calidad:'+Datos^.Calidad);
    If (Datos^.Tipo_Producto = 'RCD') or
       (Datos^.Tipo_Producto = 'RCSD') then
       OutTextXY(53*Ancho, 5*Alto, 'Cal.Insp.:'+Datos^.Calificacion+'-'
                                              +Datos^.Defecto);
    If Datos^.Tipo_Grafica = 'I' Then
      Begin
        OutTextXY(88*Ancho, 4*Alto, 'Proceso   :'+Datos^.Proceso);
        OutTextXY(88*Ancho, 5*Alto, 'Acero     :'+Datos^.Acero);
      End;
    OutTextXY( 1*Ancho, MaxY-7*Alto, 'Concepto   Punta Cuerpo Cola Rollo');
    OutTextXY( 1*Ancho, MaxY-6*Alto, '--------   ----- ------ ---- -----');
    OutTextXY( 1*Ancho, MaxY-5*Alto, 'Promedio');
    OutTextXY(12*Ancho, MaxY-5*Alto, Datos^.Promedio[1]);
    OutTextXY(18*Ancho, MaxY-5*Alto, Datos^.Promedio[2]);
    OutTextXY(25*Ancho, MaxY-5*Alto, Datos^.Promedio[3]);
    OutTextXY(30*Ancho, MaxY-5*Alto, Datos^.Promedio[4]);
    OutTextXY( 1*Ancho, MaxY-3*Alto, 'Desviacion');
    OutTextXY(12*Ancho, MaxY-3*Alto, Datos^.Desviacion[1]);
    OutTextXY(18*Ancho, MaxY-3*Alto, Datos^.Desviacion[2]);
    OutTextXY(25*Ancho, MaxY-3*Alto, Datos^.Desviacion[3]);
    OutTextXY(30*Ancho, MaxY-3*Alto, Datos^.Desviacion[4]);
    If Datos^.Tipo_Grafica = 'I' Then
      Begin
        OutTextXY( 1*Ancho, MaxY-1*Alto, 'Total Mts');
        OutTextXY(12*Ancho, MaxY-1*Alto, Datos^.Totales[1]);
        OutTextXY(18*Ancho, MaxY-1*Alto, Datos^.Totales[2]);
        OutTextXY(25*Ancho, MaxY-1*Alto, Datos^.Totales[3]);
        OutTextXY(30*Ancho, MaxY-1*Alto, Datos^.Totales[4]);
      End;
    OutTextXY(41*Ancho, MaxY-7*Alto, 'Nomenclatura');
    If ( Datos^.Elemento_Cert = '1')  or
       ( Datos^.Elemento_Cert = '2')  then
     Begin
       OutTextXY(41*Ancho, MaxY-6*Alto, 'Calibre ');
       OutTextXY( 1*Ancho, (MaxY Div 2)-6*Alto, 'C');
       OutTextXY( 1*Ancho, (MaxY Div 2)-5*Alto, 'A');
       OutTextXY( 1*Ancho, (MaxY Div 2)-4*Alto, 'L');
       OutTextXY( 1*Ancho, (MaxY Div 2)-3*Alto, 'I');
       OutTextXY( 1*Ancho, (MaxY Div 2)-2*Alto, 'B');
       OutTextXY( 1*Ancho, (MaxY Div 2)-1*Alto, 'R');
       OutTextXY( 1*Ancho, (MaxY Div 2)       , 'E');
       OutTextXY( 1*Ancho, (MaxY Div 2)+1*Alto, ' ');
       OutTextXY( 1*Ancho, (MaxY Div 2)+2*Alto, 'P');
       OutTextXY( 1*Ancho, (MaxY Div 2)+3*Alto, 'L');
       OutTextXY( 1*Ancho, (MaxY Div 2)+4*Alto, 'G');
       OutTextXY( 1*Ancho, (MaxY Div 2)+5*Alto, '''');
       OutTextXY( 1*Ancho, (MaxY Div 2)+6*Alto, 'B');
       OutTextXY( 1*Ancho, (MaxY Div 2)+7*Alto, 'S');
     end;
    If Datos^.Elemento_Cert = '3' then
      Begin
        OutTextXY(41*Ancho, MaxY-6*Alto, 'Ancho ');
        OutTextXY( 1*Ancho, (MaxY Div 2)-4*Alto, 'A');
        OutTextXY( 1*Ancho, (MaxY Div 2)-3*Alto, 'N');
        OutTextXY( 1*Ancho, (MaxY Div 2)-2*Alto, 'C');
        OutTextXY( 1*Ancho, (MaxY Div 2)-1*Alto, 'H');
        OutTextXY( 1*Ancho, (MaxY Div 2)       , 'O');
        OutTextXY( 1*Ancho, (MaxY Div 2)+1*Alto, ' ');
        OutTextXY( 1*Ancho, (MaxY Div 2)+2*Alto, 'P');
        OutTextXY( 1*Ancho, (MaxY Div 2)+3*Alto, 'L');
        OutTextXY( 1*Ancho, (MaxY Div 2)+4*Alto, 'G');
        OutTextXY( 1*Ancho, (MaxY Div 2)+5*Alto, '''');
        OutTextXY( 1*Ancho, (MaxY Div 2)+6*Alto, 'B');
        OutTextXY( 1*Ancho, (MaxY Div 2)+7*Alto, 'S');
      end;
    OutTextXY(41*Ancho, MaxY-5*Alto, '  Nominal  '+Datos^.Valor_Nominal);
    Linea (57*Ancho, MaxY-Trunc(4.5*Alto), 0, 0, 1, $09);
    OutTextXY(41*Ancho, MaxY-4*Alto, '  Promedio '+Datos^.Valor_Promedio);
    Linea (57*Ancho, MaxY-Trunc(3.5*Alto), 3, 0, 1, $0F);
    OutTextXY(41*Ancho, MaxY-3*Alto, 'Limites:   TL     TC');
    OutTextXY(41*Ancho, MaxY-2*Alto, '  Superior '+Datos^.Lim_Superior_TL);
    Linea (50*Ancho, MaxY-Trunc(1.5*Alto), 2, 0, 1, $0F);
    OutTextXY(41*Ancho, MaxY-1*Alto, '  Inferior '+Datos^.Lim_Inferior_TL);
    Linea (50*Ancho, MaxY-Trunc(0.5*Alto), 2, 0, 1, $0F);
    OutTextXY(35*Ancho, MaxY-2*Alto, '           '+Datos^.Lim_Superior_TC);
    Linea (57*Ancho, MaxY-Trunc(1.5*Alto), 1, 0, 1, $0F);
    OutTextXY(35*Ancho, MaxY-1*Alto, '           '+Datos^.Lim_Inferior_TC);
    Linea (57*Ancho, MaxY-Trunc(0.5*Alto), 1, 0, 1, $0F);
    OutTextXY(70*Ancho, MaxY-4*Alto, 'Fecha '+Valor^.Fecha+
                                   ' Hora '+Valor^.Hora);
    OutTextXY(70*Ancho, MaxY-3*Alto, 'Linea Int:'+Datos^.Linea_Int);
    If ( Datos^.Secuencia_Ext <> '000000' ) then
        OutTextXY(83*Ancho, MaxY-3*Alto, 'Linea Ext:'+Datos^.Linea_Ext);
    OutTextXY(70*Ancho, MaxY-2*Alto, 'Metodo  :'+Datos^.Metodo);
    OutTextXY(70*Ancho, MaxY-1*Alto, 'Estacion:'+Datos^.Estacion);
    SetTextStyle(DefaultFont, HorizDir, 1); Ancho := 8;
    OutTextXY( 1*Ancho, 1*Alto, 'HYLSA   CERTIFICADO DE CALIDAD');
    OutTextXY((10+(40-Length(Datos^.Titulo_Graf_2)) div 2)*Ancho, 4*Alto,
                              Datos^.Titulo_Graf_2);
    OutTextXY((20+(40-Length(Datos^.Titulo_Grafica)) div 2)*Ancho, 6*Alto,
                              Datos^.Titulo_Grafica);
    OutTextXY(35*Ancho, MaxY-8*Alto, 'M E T R O S');
    If Datos^.Tipo_Grafica = 'C' Then
       OutTextXY(59*Ancho, MaxY-6*Alto, 'Grafica para Cliente');
    OutTextXY(74*Ancho, MaxY-1*Alto, Datos^.Num_Hoja+'/'+Datos^.Tot_Hojas);
  End
 else
   encabezado_pla;
 end;
End; { Encabezados }

Procedure Horizontal (Posicion,Tipo,Patron,Anch:Word;Color:Byte; Raya,Leyenda:Boolean);
Begin
 SetLineStyle(Tipo,Patron,Anch);
 With ViewInfo Do
 Begin
  If Raya Then
  Begin
   SetColor(CualColor(1,Color));
   Line (7*Ancho,         TRUNC((Y2-Y1-2*Alto)-((Posicion-Esv[1])*YStp)),
         (X2-X1)-2*Ancho, TRUNC((Y2-Y1-2*Alto)-((Posicion-Esv[1])*YStp)));
  End;
  If Leyenda Then
  Begin
   SetColor(CualColor(1,$0F));
   If Datos^.Valor_Nominal[1] = '0' then
      OutTextXY (3*Ancho, TRUNC((Y2-Y1-2*Alto)-((Posicion-Esv[1])*YStp)),
                 '.0'+NumToStr(Posicion))
   Else
      OutTextXY (3*Ancho, TRUNC((Y2-Y1-2*Alto)-((Posicion-Esv[1])*YStp)),
                 NumToStr(Posicion));
  End;
 End;
End; { Horizontal }

Procedure Vertical (Posicion,Tipo,Patron,Anch,CteRaya:Word;Color:Byte; Raya,Leyenda:Boolean);
Begin
 SetLineStyle(Tipo,Patron,Anch);
 With ViewInfo Do
 Begin
  If Raya Then
  Begin
   SetColor(CualColor(1,Color));
   Line(7*Ancho+TRUNC((Posicion/Valor^.Distancia)*XStp), 0,
        7*Ancho+TRUNC((Posicion/Valor^.Distancia)*XStp), Y2-Y1-CteRaya*Alto);
  end;
  If Leyenda Then
  Begin
   SetColor(CualColor(1,$0F));
   OutTextXY (7*Ancho+TRUNC((Posicion/Valor^.Distancia)*XStp)-
              (Length(Trim(NumToStr(Posicion)))*Ancho) Div 2,
              Y2-Y1-((CteRaya-1)*Alto),Trim(NumToStr(Posicion)));
  End;
 End;
End; { Vertical }

Procedure EjesGrafica;
Var I, J     : Integer;
Begin             { EjesGrafica }
 SetTextStyle(SmallFont, HorizDir, 4);
 SetViewPort (1, 7*Alto, MaxX, MaxY-8*Alto, ClipOn);
 GetViewSettings (ViewInfo);
 With ViewInfo Do
 Begin
  CtlVal[1]:=X1+7*Ancho;
  CtlVal[2]:=Y1;
  CtlVal[3]:=X2-2*Ancho;
  CtlVal[4]:=Y2-2*Alto;
  CtlVal[5]:=Esv[1];
  CtlVal[6]:=Esv[2];
  XStp := (X2-X1-9*Ancho) / Valor^.Num_Muestras;
  YStp := (Y2-Y1-2*Alto)  / (Esv[2]-Esv[1]);
 End;
 Vertical   (0,                   0, 0, 1, 3, $09, True, True);
 If Datos^.Tipo_Grafica = 'I' Then
 Begin
  Vertical  (Valor^.Inicio_Cpo1,  0, 0, 1, 2, $0B, True, True);
  Vertical  (Valor^.Final_Cpo1,   0, 0, 1, 2, $0B, True, True);
  Vertical (Valor^.Fin_Rampa_Ini,     0, 0, 1, 2, $0B, True, True);
  Vertical (Valor^.Inicio_Rampa_Fin,  0, 0, 1, 2, $0B, True, True);
  If Datos^.Presentacion[1] = 'D' Then
  Begin
   Vertical   (Valor^.Soldadura,         0, 0, 1, 3, $06, True, True);
   Vertical   (Valor^.Inicio_ZS,         0, 0, 1, 2, $0B, True, True);
   Vertical   (Valor^.Fin_ZS,            0, 0, 1, 2, $0B, True, True);

  End;
 End
 Else
 Begin
  Vertical  (Valor^.Longitud Div 5 * 1, 0, 0, 2, 2, $09, False, True);
  Vertical  (Valor^.Longitud Div 5 * 2, 0, 0, 2, 2, $09, False, True);
  Vertical  (Valor^.Longitud Div 5 * 3, 0, 0, 2, 2, $09, False, True);
  Vertical  (Valor^.Longitud Div 5 * 4, 0, 0, 2, 2, $09, False, True);
 End;
 Vertical   (Valor^.Longitud,        0, 0, 1, 3, $09, True, True);
 Horizontal (Max,                    0, 0, 1, $09, True, True);
 Horizontal (Min,                    0, 0, 1, $09, True, True);
 Horizontal (Valor^.Valor_Nominal,   0, 0, 1, $09, True, True);
 Horizontal (Valor^.Valor_Promedio,  1, 0, 1, $0F, True, False);
 Horizontal (Valor^.Lim_Superior_TC, 3, 0, 1, $0F, True, True);
 Horizontal (Valor^.Lim_Inferior_TC, 3, 0, 1, $0F, True, True);
 Horizontal (Valor^.Lim_Superior_TL, 2, 0, 1, $0F, True, True);
 Horizontal (Valor^.Lim_Inferior_TL, 2, 0, 1, $0F, True, True);
 Horizontal (Valor^.Lim_Superior_ZS, 4, 0, 1, $0F, True, True);
 Horizontal (Valor^.Lim_Inferior_ZS, 4, 0, 1, $0F, True, True);

End; { EjesGrafica }


Procedure GraficaPuntos;
Var Obs      : Word;
    PX       : Integer;
Begin
 SetViewPort     (1+7*Ancho, 7*Alto, MaxX-2*Ancho, MaxY-10*Alto, ClipOn);
 GetViewSettings (ViewInfo);
 With ViewInfo Do
 Begin
  If Valor^.Num_Muestras >= 400 then Valor^.Num_Muestras := 399;
  For Obs := 1 To Valor^.Num_Muestras Do
  Begin
   PX:=TRUNC(XStp*(Obs-0.5));
   SetColor(CualColor(1,$02));
   SetLineStyle(0, 0, 1);
   If Obs < Valor^.Num_Muestras Then
    Line( PX,             TRUNC((Y2-Y1)-((Valor^.Muestras[Obs  ]-Esv[1])*YStp)),
          PX+TRUNC(XStp), TRUNC((Y2-Y1)-((Valor^.Muestras[Obs+1]-Esv[1])*YStp)));

  End;
 End;
End; { GraficaPuntos }

Function DecideImprimirGrf: Boolean;
Var R, RR, F : Real;
           I : Byte;
    Tamano   : Word;
    ImgPtr   : Pointer;
Begin
 If Datos^.Pregunta_Impr = NO Then
  Ch := F1
 Else
 Begin
  SetScreen (CurrentScr);
  Tamano := ImageSize(0, 0, 12*Ancho, 2*Alto);
  GetMem(ImgPtr, Tamano);
  GetImage(0, 0, 12*Ancho, Alto, ImgPtr^);
  M_SetGrafCur(0,0,1);
  M_ShowCur;
  RR := 0;
  Repeat
   Ch := #0;
   If KeyPressed Then
   Repeat
    Ch := GetKey;
   Until Ch <> Null;
   M_GetPix (M_Clip,M_Col,M_Ren);
   M_Ren := M_Ren + 8;
   M_Col := M_Col + 6;
   R := 0;
   F := 0;
   If ((M_Ren >= CtlVal[2]-1) and (M_Ren <= CtlVal[4])) and
      ((M_Col >= CtlVal[1]-1) and (M_Col <= CtlVal[3])) Then
   Begin
    R:=(CtlVal[4]-M_Ren);
    F:=(CtlVal[6]-CtlVal[5])/((CtlVal[4]-CtlVal[2])+1);
    If RR <> (R*F)+CtlVal[5] Then
    Begin
     SetFillStyle (SolidFill, Cualcolor(1,White));
     Bar (0,0,12*Ancho,Alto);
     SetColor(CualColor(0,Black));
     OutTextXY(0,0,'VALOR : '+Cambs(4,0,(R*F)+CtlVal[5]));
    End;
    RR := (R*F)+CtlVal[5];
   End;
  Until Ch in [ESC,F1];
  M_HideCur;
  PutImage(0, 0, ImgPtr^, CopyPut);
  FreeMem(ImgPtr, Tamano);
 End;
 DecideImprimirGrf := (Ch = F1);
End; { DecideImprimirGrf }

Procedure Grafica;
Begin
 Datos_A_Valor;
 If ( Datos^.Elemento_Cert = '1' ) then
 Begin
 Max := Valor^.Lim_Superior_ZS +
        Trunc ((Valor^.Lim_Superior_ZS-Valor^.Valor_Nominal)*(Valor^.Limite_Grafica / 100));
 Min := Valor^.Lim_Inferior_ZS -
        Trunc ((Valor^.Valor_Nominal-Valor^.Lim_Inferior_ZS)*(Valor^.Limite_Grafica / 100));
 End;
 If ( Datos^.Elemento_Cert = '2' ) or
    ( Datos^.Elemento_Cert = '3' ) then
 Begin
   Max := Valor^.Lim_Superior_TC +
        Trunc ((Valor^.Lim_Superior_TC-Valor^.Valor_Nominal)*(Valor^.Limite_Grafica / 100));
   Min := Valor^.Lim_Inferior_TC -
        Trunc ((Valor^.Valor_Nominal-Valor^.Lim_Inferior_TC)*(Valor^.Limite_Grafica / 100));
 End;
 CalculaEscala;
 Encabezados;
 EjesGrafica;
 GraficaPuntos;
{ If DecideImprimirGrf Then
  Case Datos^.Tipo_Impr Of
   '1','2': If GraphDriver in [CGA, MCGA, HercMono, ATT400] Then
             Impacto
            Else
             Impacto;
   '3'    : Laser (Grf, Null);
  End;}
End; { Grafica }

Function DecideImprimirTxt : Boolean;
Begin
 If Datos^.Pregunta_Impr = NO Then
  Ch := F1
 Else
  Repeat
   Ch := GetKey;
  Until Ch In [Esc, F1];
 DecideImprimirTxt := (Ch = F1);
End;

Procedure MensajeInicio;
Begin
 Datos^.Renglon1 := 'INICIAN GRAFICAS';
 Datos^.Renglon2 := '';
 Datos^.Renglon3 := 'REMISION: '+Datos^.Num_Remision;
 MensajeGrf (2,2);
{ If DecideImprimirTxt Then
  Case Datos^.Tipo_Impr Of
   '1','2': Impacto;
   '3'    : Laser  (Txt,Top);
  End;}
End; { MensajeInicio }

Procedure MensajeVariable;
Begin
 MensajeGrf (16,(CurrentScr.Y2-CurrentScr.Y1) Div (2*Alto));
{ If DecideImprimirTxt Then
  Case Datos^.Tipo_Impr Of
   '1','2' : Impacto;
   '3'     : Laser  (Txt,Center);
  End;}
End; { MensajeVariable }

Procedure MensajeFin;
Begin
 Datos^.Renglon1 := 'TERMINAN GRAFICAS';
 Datos^.Renglon2 := '';
 Datos^.Renglon3 := 'REMISION: '+Datos^.Num_Remision;
 MensajeGrf (28,(CurrentScr.Y2 Div Alto)-4);
{ If DecideImprimirTxt Then
  Case Datos^.Tipo_Impr Of
   '1','2' : Impacto;
   '3'     : Laser  (Txt, Bottom);
  End;}
End; { MensajeFin }

Begin
End.