unit Graph1D;
{ modif: 30/10/00 Edouard :+ procedure cocourbedropdown initialise les items des cocourbe }
{ MODIFICATIONS                                                                    }
{ mise a jour le 31.10.2000                                                        }
{ 8/11/00 : Claire : + procedure xyGraph1MoveMouse donne les coordonnées quand la  }
{                    souris se déplace dans le plan                                }
{ 01.02.01 : FO : modification de l'initialisation du graph1D                      }
{ 14.03.01 : FO : passage en Log est toujours possible parce que le internal zero  }
{                 a été fixé à -0.000001                                           }
{                 (lors de la création du graph                                    }
{                 InternalZero is subtracted from the Y value before anything else is done }
{                 Ca marche bien sauf que l'échelle démaree a 10E-6 (i lfaut changer a la main }
{ 06.06.01 : FO : ajout de deux bouttons autoscales Xauto et Yauto                   }
{ 10.06.01 : FO : nettoyage de la mise en page                                       }
{                 ajout de 4 boites pour fixer les echelles sans passer par le menu Designer }
{ 10.06.01 : FO : nouveau menus :                                                            }
{                 destruction de spectres A,B,C ou D                                         }
{ 10.06.01 : FO : nouveau menus :                                                            }
{                 lecture et sauvegarde des courbes A,B,C ou D                               }
{                 extension par défaut .1D; repertoire donné par la boite noire              }
{ 12.06.01 : EL : création de procedure Tgraph1dform.AddHint(Cible: TComboBox); pour mettre commentaire
{                 et conditions exp dans le Hint des Combos
{                 appelle de cette fonction dans cocourbe1Change                 }
{ 18.03.02 : FO : * fonction de calcul de l'integrale entre les deux curseurs    }
{ 02.04.02 : FO : * label mis a jour automatiquement pour l'axe des X (a partir de typeX) }
{                   de la "courbe 1" !                                           } 
{ version A JOUR le 25.09.01}
{ 17.07.02 : FO : * update du miniparser                                        }
{ 06.07.02 : FO : * possibilité de tracer des spectres complexes                }
{                   seule condition : il faut que le champ ExpCond[0] soit égal à 'Complex' }
{ 29.08.02 : FO : * nouvelle fonction de destruction de tous les spectres inutiles }
{                   ca permet de purger la liste de temps en temps              }
{ 26.09.02 : FO : * sauvegarde automatique des spectres crées avec le miniparser}
{                   sous la forme de fichiers textes                            }
{ 16.12.02 : FO : * il n'est plus possibl d'ecraser un fichier NeXuS existant   }
{ ================================================================================== }
{ A FAIRE                                                                            }
{ lorsque qu'on utilise l'éditeur, les combo box des graph se réinitilasent à rien ?!? }
{ a corriger voir ligne 376                                                                          }
{ DANGER : neau Bug inttroduit par la possibilité de destruction des courbes    }
{          on  met par defaut la courbe 1D n° 1 => plantage si c'est la courbe qu'on vient de detruire .. }
{          c'est un bug mineur                                                  }
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, xyGraph, StdCtrls, ComCtrls, Spin, Buttons, ToolWin,
  math,xydesign,xyDatWiz, Menus,editdata, Parser10, controlesDivers,
  EditReal, JvComponent, FileCtrl, JvDriveCtrls,StrUtils, JvFormPlace;
const
wm_fermeture=$400+wm_user;
wm_redessiner=$401+wm_user;
type
  Tgraph1dform = class(TForm)
    xyGraph1: TxyGraph;
    Panel1: TPanel;
    MainMenu1: TMainMenu;
    Nouvelle1: TMenuItem;
    Panel10: TPanel;
    Panel11: TPanel;
    cocourbe1: TComboBox;
    perbox1: Tperbox;
    Panel12: TPanel;
    cocourbe2: TComboBox;
    perbox2: Tperbox;
    Panel13: TPanel;
    cocourbe3: TComboBox;
    perbox3: Tperbox;
    Panel14: TPanel;
    cocourbe4: TComboBox;
    perbox4: Tperbox;
    Panel2: TPanel;
    Edit5: TEdit;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    Parser1: TParser;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    Save: TMenuItem;
    readCOurbe: TMenuItem;
    SpeedButton7: TSpeedButton;
    ToggleLinLog: TButton;
    SpeedButton8: TSpeedButton;
    Panel3: TPanel;
    Label4: TLabel;
    Label5: TLabel;
    XminBox: TEditReal;
    XmaxBox: TEditReal;
    YminBox: TEditReal;
    YmaxBox: TEditReal;
    Label6: TLabel;
    Label7: TLabel;
    Panel4: TPanel;
    Ypos: TEditReal;
    Xpos: TEditReal;
    Label2: TLabel;
    Label3: TLabel;
    Panel5: TPanel;
    PosCurseurRouge: TEdit;
    Edit2: TEdit;
    SpinButton1: TSpinButton;
    PosCurseurBleu: TEdit;
    Edit4: TEdit;
    SpinButton2: TSpinButton;
    ReadA: TMenuItem;
    ReadB: TMenuItem;
    ReadC: TMenuItem;
    ReadD: TMenuItem;
    SaveA: TMenuItem;
    SaveB: TMenuItem;
    SaveC: TMenuItem;
    SaveD: TMenuItem;
    DeleteA: TMenuItem;
    DeleteB: TMenuItem;
    DeleteC: TMenuItem;
    DeleteD: TMenuItem;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Panel6: TPanel;
    CourbeAintegrerBox: TComboBox;
    IntegralBox: TEditReal;
    N1: TMenuItem;
    SaveA_ASCII: TMenuItem;
    B1: TMenuItem;
    C1: TMenuItem;
    D1: TMenuItem;
    ReadFrom001: TMenuItem;
    Operation1: TMenuItem;
    Delete1: TMenuItem;
    D2: TMenuItem;
    C2: TMenuItem;
    B2: TMenuItem;
    A1: TMenuItem;
    Print1: TMenuItem;
    Graph1D1: TMenuItem;
    SavetoNeXuS1: TMenuItem;
    A2: TMenuItem;
    B3: TMenuItem;
    C3: TMenuItem;
    D3: TMenuItem;
    ReadfromNeXus1: TMenuItem;
    A3: TMenuItem;
    B4: TMenuItem;
    C4: TMenuItem;
    D4: TMenuItem;
    ReadformNexLLB1: TMenuItem;
    All1: TMenuItem;
    Save1: TMenuItem;
    CopyToClipboard1: TMenuItem;
    AutoSave1: TMenuItem;
    ReadUXD1: TMenuItem;
    ReadG41dat1: TMenuItem;
    ReadFromASCII1: TMenuItem;
    Panel7: TPanel;
    FileTypeButton: TButton;
    FileNrSpinEdit: TSpinEdit;
    GetFileButton: TButton;
    CalculationCombo: TComboBox;
    Displayerrorbarslinscaleonly1: TMenuItem;
    CalculateErrorBars1: TMenuItem;
    JvFormPlace1: TJvFormPlace;
    Edit1: TMenuItem;
    SavetoXY1: TMenuItem;
    Open1: TMenuItem;
    Save2: TMenuItem;
    FileListBox: TJvFileListBox;
    ReadMcStas1: TMenuItem;
    procedure cocourbedropdown(sender:tobject);
    procedure Button1Click(Sender: TObject);
    procedure AddHint(Cible: TComboBox);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure xyGraph1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure cocourbe1Change(Sender: TObject);
    procedure perbox1change(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure Edit5KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure SpinButton1UpClick(Sender: TObject);
    procedure SpinButton1DownClick(Sender: TObject);
    procedure SpinButton2DownClick(Sender: TObject);
    procedure SpinButton2UpClick(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure ToggleLinLogClick(Sender: TObject);
    procedure xyGraph1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure SpeedButton8Click(Sender: TObject);
    procedure XminBoxKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure XmaxBoxKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure YminBoxKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure YmaxBoxKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DeleteAClick(Sender: TObject);
    procedure DeleteBClick(Sender: TObject);
    procedure DeleteCClick(Sender: TObject);
    procedure DeleteDClick(Sender: TObject);
    procedure SaveAClick(Sender: TObject);
    procedure SaveBClick(Sender: TObject);
    procedure SaveCClick(Sender: TObject);
    procedure SaveDClick(Sender: TObject);
    procedure ReadAClick(Sender: TObject);
    procedure ReadBClick(Sender: TObject);
    procedure ReadCClick(Sender: TObject);
    procedure ReadDClick(Sender: TObject);
    procedure SaveA_ASCIIClick(Sender: TObject);
    procedure B1Click(Sender: TObject);
    procedure C1Click(Sender: TObject);
    procedure D1Click(Sender: TObject);
    procedure Read00AClick(Sender: TObject);
    procedure perbox2change(Sender: TObject);
    procedure perbox3change(Sender: TObject);
    procedure perbox4change(Sender: TObject);
    procedure A2Click(Sender: TObject);
    procedure B3Click(Sender: TObject);
    procedure C3Click(Sender: TObject);
    procedure D3Click(Sender: TObject);
    procedure A3Click(Sender: TObject);
    procedure ReadformNexLLB1Click(Sender: TObject);
    procedure B4Click(Sender: TObject);
    procedure C4Click(Sender: TObject);
    procedure D4Click(Sender: TObject);
    procedure All1Click(Sender: TObject);
    procedure Save1Click(Sender: TObject);
    procedure CopyToClipboard1Click(Sender: TObject);
    procedure AutoSave1Click(Sender: TObject);
    procedure ReadUXD1Click(Sender: TObject);
    procedure ReadG41dat1Click(Sender: TObject);
    procedure ReadFromASCII1Click(Sender: TObject);
    procedure FileTypeButtonClick(Sender: TObject);
    procedure GetFileButtonClick(Sender: TObject);
    procedure CourbeAintegrerBoxChange(Sender: TObject);
    procedure CalculationComboChange(Sender: TObject);
    procedure Displayerrorbarslinscaleonly1Click(Sender: TObject);
    procedure CalculateErrorBars1Click(Sender: TObject);
    procedure SavetoXY1Click(Sender: TObject);
    procedure ReadFrom001Click(Sender: TObject);
    procedure ReadMcStas1Click(Sender: TObject);
  private
    index1,index2:integer;
    arrayzoom:array[0..15,1..4] of double;
    indexzoom:integer;
    procedure fermeture(var msg:tmessage); message wm_fermeture;
    procedure wmredessiner(var msg:tmessage); message wm_redessiner;
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure OpenFile1D(FileName:string);
    procedure OpenFileNexusLLB(FileName:string);
    procedure redessiner;
    procedure changegain(var msg:tmessage);message wm_user+wm_gain;
    procedure tfrspectre(i:integer;courbe:integer);
    procedure traitchaine(s:string);
    function  calculeIntegrale:double;
    function calculeMonitor:double;
end;

var
  graph1dform: Tgraph1dform;
  coul:array[1..16] of tcolor;
  ga:array[1..16] of integer;
implementation

uses BoiteNoire;

{$R *.DFM}

procedure Tgraph1dform.OpenFile1D(FileName:string);
var l,vind:integer;
    nom,ext:string;
begin
   l:=length(filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=filename[l]+ext;
   until filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=filename[l]+nom;
   l:=l-1;
   until filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].open(filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);
end;

procedure Tgraph1dform.OpenFileNexusLLB(FileName:string);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
   l:=length(filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=filename[l]+ext;
   until filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=filename[l]+nom;
   l:=l-1;
   until filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromNeXusLLB(filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
end;

procedure Tgraph1dform.cocourbedropdown(sender:tobject);
var i:integer;
begin
cocourbe1.items.clear;
cocourbe2.items.clear;
cocourbe3.items.clear;
cocourbe4.items.clear;

for i:=1 to totalspectre do
if und.spect[i]<>nil then
   begin
   cocourbe1.items.add(und.spect[i].nom);
   cocourbe2.items.add(und.spect[i].nom);
   cocourbe3.items.add(und.spect[i].nom);
   cocourbe4.items.add(und.spect[i].nom);
   end;
end;
{************************
Ajoute commentaire et condition Exp en Hint}
procedure Tgraph1dform.AddHint(Cible: TComboBox);
var s:string;
    vind,i:integer;
begin
vind:=und.indexof(Cible.text);
s:=und.spect[vind].comment;
if und.spect[vind].ExpCondNbr >0 then
   for i:=0 to und.spect[vind].ExpCondNbr-1 do
       s:=s+#10+und.spect[vind].experimentalConditions[i].name+' : '+floattostr(und.spect[vind].experimentalConditions[i].value);
cible.showHint:=true;
cible.hint:=s;
end;

procedure Tgraph1dform.redessiner;
begin
cocourbe1change(cocourbe1);
cocourbe1change(cocourbe2);
cocourbe1change(cocourbe3);
cocourbe1change(cocourbe4);
integralBox.Value:=calculeIntegrale;
end;

procedure Tgraph1dform.wmredessiner(var msg:tmessage);
begin
redessiner;
end;

procedure Tgraph1dform.fermeture(var msg:tmessage);
begin
release;
end;

procedure Tgraph1dform.Button1Click(Sender: TObject);
begin
redessiner;
end;

procedure Tgraph1dform.SpeedButton2Click(Sender: TObject);
begin
xygraph1.print;
end;

procedure Tgraph1dform.SpeedButton3Click(Sender: TObject);
begin
editxyGraph(self, xyGraph1);
end;

procedure Tgraph1dform.SpeedButton5Click(Sender: TObject);
begin
if indexzoom>=1 then begin
indexzoom:=indexzoom-1;
xygraph1.xaxis.min:=arrayzoom[indexzoom,1];
xygraph1.xaxis.max:=arrayzoom[indexzoom,2];
(xygraph1.annotations[1] as tmark).x1:=arrayzoom[indexzoom,3];
(xygraph1.annotations[2] as tmark).x1:=arrayzoom[indexzoom,4];
end;
end;

procedure Tgraph1dform.SpeedButton6Click(Sender: TObject);
var
i:integer;
v1,v2:double;
begin
if indexzoom=0 then begin
arrayzoom[indexzoom,1]:=xygraph1.xaxis.min;
arrayzoom[indexzoom,2]:=xygraph1.xaxis.max;
arrayzoom[indexzoom,3]:=(xygraph1.annotations[1] as tmark).x1;
arrayzoom[indexzoom,4]:=(xygraph1.annotations[2] as tmark).x1;
end;
v1:=(xygraph1.annotations[1] as tmark).x1;
v2:=(xygraph1.annotations[2] as tmark).x1;
if v2>v1 then begin
indexzoom:=indexzoom+1;
if indexzoom>15 then begin
indexzoom:=15;
for i:=1 to 14 do begin
arrayzoom[i,1]:=arrayzoom[i+1,1];
arrayzoom[i,2]:=arrayzoom[i+1,2];
arrayzoom[i,3]:=arrayzoom[i+1,3];
arrayzoom[i,4]:=arrayzoom[i+1,4];
end;
end;
arrayzoom[indexzoom,1]:=v1;arrayzoom[indexzoom,2]:=v2;
arrayzoom[indexzoom,3]:=v1;arrayzoom[indexzoom,4]:=v2;
xygraph1.xaxis.min:=v1;
xygraph1.xaxis.max:=v2;
end;
end;

procedure Tgraph1dform.FormCreate(Sender: TObject);
var
i:integer;
tf:boolean;
begin
windowState:=wsMinimized;
left:=0;top:=0;width:=520;height:=400;
{ pour eviter les problèmes avec les zero et les echelles log }
xygraph1.series[1].internalzero:=-0.000001;
xygraph1.series[2].internalzero:=-0.000001;
xygraph1.series[3].internalzero:=-0.000001;
xygraph1.series[4].internalzero:=-0.000001;
for i:=1 to 4 do ga[i]:=1;
tf:=false;
xygraph1.Addmark(1,xygraph1.xAxis.Min,xygraph1.YAxis.Min,xygraph1.xAxis.Min,xygraph1.YAxis.Max,clred,'1',mtxmark ,mpUpLeft, dtAfter);
xygraph1.Addmark(2,xygraph1.xAxis.Max,xygraph1.YAxis.Min,xygraph1.xAxis.Max,xygraph1.YAxis.Max,clblue,'2',mtxmark ,mpUpLeft, dtAfter);
coul[1]:=$000000;coul[2]:=$0000FF;coul[3]:=$FF0000;
coul[4]:=$007F00;coul[5]:=$FFFF00;coul[6]:=$FF00FF;
coul[7]:=$00FFFF;coul[8]:=$7F0000;

{ version FO }
for i:=1 to totalspectre do
    if und.spect[i]<>nil
    then case i of
         1:begin cocourbe1.items.add(und.spect[i].nom);cocourbe1.text:=und.spect[i].nom;tfrspectre(i,1) end;
         2:begin cocourbe2.items.add(und.spect[i].nom);cocourbe2.text:=und.spect[i].nom;tfrspectre(i,2) end;
         3:begin cocourbe3.items.add(und.spect[i].nom);cocourbe3.text:=und.spect[i].nom;tfrspectre(i,3) end;
         4:begin cocourbe4.items.add(und.spect[i].nom);cocourbe4.text:=und.spect[i].nom;tfrspectre(i,4) end;
         end;
perbox1.graph:=handle;perbox2.graph:=handle;perbox3.graph:=handle;perbox4.graph:=handle;
perbox1.setval(6);perbox2.setval(6);perbox3.setval(6);perbox4.setval(6);
indexzoom:=0;

end;

{ transfert d'un spectre du tableau des spectres dans une courbe }
{ INPUT : numero du spectre 1D a transferer                      }
{         courbe, n° de la courbe dans laquelle le spectre doit arriver }
{ REM : faire le transfert avec un passage du spectre dans la procédure }
{       et pas uniquement son numéro                                    }
procedure Tgraph1dform.tfrspectre(i:integer;courbe:integer);
var
j:integer;
tf:boolean;
begin
tf:=false;
if (courbe>=1) and (courbe<=4) then begin
xygraph1.series[courbe].holdupdates:=true;
xygraph1.Series[courbe].clear;
xygraph1.Series[courbe].seriesname:=und.spect[i].nom;
xygraph1[courbe].drawpoints:=false;
xygraph1[courbe].linecolor:=coul[courbe];
xygraph1[courbe].LineStyle:=pssolid;
if (und.spect[i].typex='raw') or (und.spect[i].typex='RMNdir') or (und.spect[i].typex='RMN') or (und.spect[i].typex='FFT') then begin
  for j:=0 to und.spect[i].x-1 do
  begin
    if xyGraph1.Xaxis.Logscale
    then begin { on fait sauter le spoints inférieurs à zéro }
         if und.spect[i].data[j,0,0].x>0 thenxygraph1.Series[courbe].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].z*intpower(2,ga[courbe]-6));
         end
    else xygraph1.Series[courbe].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].z*intpower(2,ga[courbe]-6));
  end;


    if und.Spect[i].expCondNbr=1 then
       if und.Spect[i].experimentalConditions[0].name='Complex'
       then begin
            xygraph1.Series[courbe].seriesname:=und.spect[i].nom+'_re';
            xygraph1.series[courbe+4].holdupdates:=true;
            xygraph1.Series[courbe+4].clear;
            xygraph1.Series[courbe+4].seriesname:=und.spect[i].nom+'_im';
            xygraph1[courbe+4].drawpoints:=false;
            xygraph1[courbe+4].linecolor:=coul[courbe+4];
            xygraph1[courbe+4].LineStyle:=pssolid;
            for j:=0 to und.spect[i].X-1 do begin
                xygraph1.Series[courbe+4].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].mon*intpower(2,ga[courbe]-6));
                end;
            xygraph1.series[courbe+4].holdupdates:=false;
            end;
    tf:=true;end;

if und.spect[i].typex='reflec' then begin
  for j:=1 to und.spect[i].indexX do
    xygraph1.Series[courbe].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].z*intpower(2,ga[courbe]-6));
    if und.Spect[i].expCondNbr=1 then
       if und.Spect[i].experimentalConditions[0].name='Complex'
       then begin
            xygraph1.Series[courbe+4].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].mon*intpower(2,ga[courbe]-6));
            end;
    tf:=true;end;

{if und.spect[i].typex='RMNdir' then begin
  for j:=0 to und.spect[i].indexX-1 do
    xygraph1.Series[courbe].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].z*intpower(2,ga[courbe]-6));
    tf:=true;end; }
{ if (und.spect[i].typex='RMN') or (und.spect[i].typex='FFT') then begin
  xygraph1.series[courbe+4].holdupdates:=true;
  xygraph1.Series[courbe+4].clear;
  xygraph1.Series[courbe+4].seriesname:=und.spect[i].nom;
  xygraph1[courbe+4].drawpoints:=false;
  xygraph1[courbe+4].linecolor:=coul[courbe+4];
  xygraph1[courbe+4].LineStyle:=pssolid;
  for j:=0 to und.spect[i].indexX-1 do begin
  xygraph1.Series[courbe].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].z*intpower(2,ga[courbe]-6));
  xygraph1.Series[courbe+4].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].mon*intpower(2,ga[courbe]-6));
  end;
  xygraph1.series[courbe+4].holdupdates:=false;
  tf:=true;end;                                    }

if not tf then
  for j:=0 to und.spect[i].x-1 do xygraph1.Series[courbe].add(und.spect[i].data[j,0,0].x,und.spect[i].data[j,0,0].z*intpower(2,ga[courbe]-6));
xygraph1.series[courbe].holdupdates:=false;
end;

end;

procedure Tgraph1dform.changegain(var msg:tmessage);
begin
  if (msg.wparam<=4)and (msg.wparam>=1) then begin
  if msg.lparam=3 then
  xygraph1.series[msg.wparam].active:=false;
  if msg.lparam=2 then
  xygraph1.series[msg.wparam].active:=true;
  if msg.lparam=1 then begin
  {left button}end;
  if msg.lparam=-1 then begin
  {right button}end;
  end else begin
  ga[msg.wparam-10]:=msg.lparamlo;
  case msg.wparam-10 of
  1:cocourbe1change(cocourbe1);
  2:cocourbe1change(cocourbe2);
  3:cocourbe1change(cocourbe3);
  4:cocourbe1change(cocourbe4);
  end;
  end;
  end;

procedure Tgraph1dform.xyGraph1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var
  x2,y2:double;
  x3,y3:double;
  index:integer;
begin
  inherited;
{ lecture de la position du curseur }
xygraph1.GetMouseXY(1, x, y, index, x2, y2, x3, y3);
{ placement du curseur rouge }
if button=mbleft then begin
if (x2<(xygraph1.XAxis.min)) or (y2<(xygraph1.YAxis.min))
then editxyGraph(self, xyGraph1) { si on pointe sur l'echelle des ordonnées }
else begin
     PosCurseurRouge.text:=floattostrf(x3,fffixed,5,7);
     edit2.text:=floattostrf(y3,fffixed,4,8);
     (xygraph1.Annotations[1] as TMark).x1 := x3;
     (xygraph1.Annotations[1] as TMark).x2 := x3;
     index1:=index;
     end
end;
{ placement du curseur bleu }
if button=mbright then begin
if (x2<(xygraph1.XAxis.min)) or (y2<(xygraph1.YAxis.min))
then editxyGraph(self, xyGraph1) { si on pointe sur l'echelle des ordonnées }
else begin
     PosCurseurBleu.text:=floattostrf(x3,fffixed,5,7);
     edit4.text:=floattostrf(y3,fffixed,4,8);
     (xygraph1.Annotations[2] as TMark).x1 := x3;
     (xygraph1.Annotations[2] as TMark).x2 := x3;
     index2:=index;
     end;
end;
integralBox.Value:=calculeIntegrale;
end;

procedure Tgraph1dform.cocourbe1Change(Sender: TObject);
begin
if sender=cocourbe1 then
   begin
   tfrspectre(und.indexof(cocourbe1.text),1);
   xygraph1.xaxis.Title:=und.spect[und.indexof(cocourbe1.text)].typeX;
   AddHint(cocourbe1)
   end;
if sender=cocourbe2 then
   begin
   tfrspectre(und.indexof(cocourbe2.text),2);
   AddHint(cocourbe2)
   end;
if sender=cocourbe3 then
   begin
   tfrspectre(und.indexof(cocourbe3.text),3);
   AddHint(cocourbe3)
   end;
if sender=cocourbe4 then
   begin
   tfrspectre(und.indexof(cocourbe4.text),4);
   AddHint(cocourbe4)
   end;
end;

procedure Tgraph1dform.perbox1change(Sender: TObject);
begin
if perbox1.getcheck=1 then xygraph1.series[1].active:=true
else xygraph1.series[1].active:=false;
if perbox1.getcheck=1 then xygraph1.series[5].active:=true
else xygraph1.series[5].active:=false;

end;

procedure Tgraph1dform.SpeedButton4Click(Sender: TObject);
begin
ShowxyDataWizard(self, xyGraph1);
end;

procedure Tgraph1dform.Edit5KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var s1,s2:string;
    vind:integer;
begin
   if key=13
   then begin
        s1:=edit5.text;
        traitchaine(s1);
        if autoSave1.checked=true
        then begin
             s2:=copy(s1,1,pos('=',s1)-1);
             savedialog1.defaultExt:='*.txt';savedialog1.filter:='*.txt|*.txt';
             vind:=und.indexof(s2);
             savedialog1.fileName:=s2+'.txt';
             und.spect[vind].saveToASCII_2col(savedialog1.filename);
             end;
        redessiner;
        end;
end;

procedure Tgraph1dform.traitchaine(s:string); {Ne fonctionne pas bien ???}
var
i:integer;
begin
und.parsechaine(s);
{cocourbe1.clear;cocourbe2.clear;
ocourbe4.clear;cocourbe3.clear;
for i:=1 to totalspectre do
if und.spect[i]<>nil then begin
cocourbe1.items.add(und.spect[i].nom);
cocourbe2.items.add(und.spect[i].nom);
cocourbe3.items.add(und.spect[i].nom);
cocourbe4.items.add(und.spect[i].nom); }
{ c'est foireux, ca ne s'applique que quand on ajoute un nouveau spectre }
i:=1;
while und.spect[i]<>nil do inc(i);
dec(i);
cocourbe1.items.add(und.spect[i].nom);
cocourbe2.items.add(und.spect[i].nom);
cocourbe3.items.add(und.spect[i].nom);
cocourbe4.items.add(und.spect[i].nom);
end;


procedure Tgraph1dform.SpinButton1UpClick(Sender: TObject);
var
x,y,r:double;
index4:integer;
begin
index1:=index1+1;
index4:=index1;
if xygraph1.series[1].GetPoint(index4,x, y,r) then begin
(xygraph1.Annotations[1] as TMark).x1 := x;
(xygraph1.Annotations[1] as TMark).x2 := x;
PosCurseurRouge.text:=floattostrf(x,fffixed,5,7);
edit2.text:=floattostrf(y,fffixed,4,8);
end else begin
index1:=index1-1;
end;
end;

procedure Tgraph1dform.SpinButton1DownClick(Sender: TObject);
var
x,y,r:double;
index4:integer;
begin
index1:=index1-1;
index4:=index1;
if xygraph1.series[1].GetPoint(index4,x, y,r) then begin
(xygraph1.Annotations[1] as TMark).x1 := x;
(xygraph1.Annotations[1] as TMark).x2 := x;
PosCurseurRouge.text:=floattostrf(x,fffixed,5,7);
edit2.text:=floattostrf(y,fffixed,4,8);
end else begin
index1:=index1+1;
end;
end;

procedure Tgraph1dform.SpinButton2DownClick(Sender: TObject);
var
x,y,r:double;
index4:integer;
begin
index2:=index2-1;
index4:=index2;
if xygraph1.series[1].GetPoint(index4,x, y,r) then begin
(xygraph1.Annotations[2] as TMark).x1 := x;
(xygraph1.Annotations[2] as TMark).x2 := x;
PosCurseurBleu.text:=floattostrf(x,fffixed,5,7);
edit4.text:=floattostrf(y,fffixed,4,8);
end else begin
index2:=index2+1;
end;
end;

procedure Tgraph1dform.SpinButton2UpClick(Sender: TObject);
var
x,y,r:double;
index4:integer;
begin
index2:=index2+1;
index4:=index2;
if xygraph1.series[1].GetPoint(index4,x, y,r) then begin
(xygraph1.Annotations[2] as TMark).x1 := x;
(xygraph1.Annotations[2] as TMark).x2 := x;
PosCurseurBleu.text:=floattostrf(x,fffixed,5,7);
edit4.text:=floattostrf(y,fffixed,4,8);
end else begin
index2:=index2-1;
end;
end;

procedure Tgraph1dform.SpeedButton8Click(Sender: TObject);
begin
if xygraph1.xaxis.autosizing then begin
xygraph1.xaxis.autosizing:=false;
speedbutton8.caption:='Xman';
end else begin
xygraph1.xaxis.autosizing:=true;
speedbutton8.caption:='Xauto';
end;
end;

procedure Tgraph1dform.SpeedButton7Click(Sender: TObject);
begin
if xygraph1.yaxis.autosizing then begin
xygraph1.yaxis.autosizing:=false;
speedbutton7.caption:='Yman';
end else begin
xygraph1.yaxis.autosizing:=true;
speedbutton7.caption:='Yauto';
end;
end;



procedure Tgraph1dform.ToggleLinLogClick(Sender: TObject);
begin
     If ToggleLinLog.caption='Lin'
     then begin
          xygraph1.Yaxis.Logscale:=True;
          ToggleLinLog.caption:='Log'
          end
     else begin
          xyGraph1.Yaxis.Logscale:=False;
          ToggleLinLog.caption:='Lin'
          end;
     redessiner
end;

{Donne les coordonnées quand la souris se déplace dans le plan}
procedure Tgraph1dform.xyGraph1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
     Xpos.value:=xyGraph1.GetMouseX(X);
     Ypos.value:=xyGraph1.GetMouseY(Y);
end;


{ mise a jour des echelles }
procedure Tgraph1dform.XminBoxKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if key=13 then begin xygraph1.XAxis.min:=XminBox.value;redessiner end;
end;

procedure Tgraph1dform.XmaxBoxKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if key=13 then begin xygraph1.XAxis.max:=XmaxBox.value;redessiner end;
end;

procedure Tgraph1dform.YminBoxKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if key=13 then begin xygraph1.YAxis.min:=YminBox.value;redessiner end;
end;

procedure Tgraph1dform.YmaxBoxKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if key=13 then begin xygraph1.YAxis.max:=YmaxBox.value;redessiner end;
end;

{ destruction des courbes }
procedure Tgraph1dform.DeleteAClick(Sender: TObject);
var vind:integer;
begin
vind:=und.indexof(cocourbe1.text);
und.deletespectre(vind);
cocourbe1.items.delete(cocourbe1.itemindex);
cocourbe1.text:=und.spect[1].nom;
cocourbe1Change(cocourbe1);
end;
procedure Tgraph1dform.DeleteBClick(Sender: TObject);
var vind:integer;
begin
vind:=und.indexof(cocourbe2.text);
und.deletespectre(vind);
cocourbe2.items.delete(cocourbe2.itemindex);
cocourbe2.text:=und.spect[1].nom;
cocourbe1Change(cocourbe2);
end;
procedure Tgraph1dform.DeleteCClick(Sender: TObject);
var vind:integer;
begin
vind:=und.indexof(cocourbe3.text);
und.deletespectre(vind);
cocourbe3.items.delete(cocourbe3.itemindex);
cocourbe3.text:=und.spect[1].nom;
cocourbe1Change(cocourbe3);
end;
procedure Tgraph1dform.DeleteDClick(Sender: TObject);
var vind:integer;
begin
vind:=und.indexof(cocourbe4.text);
und.deletespectre(vind);
cocourbe4.items.delete(cocourbe4.itemindex);
cocourbe4.text:=und.spect[1].nom;
cocourbe1Change(cocourbe4);
end;

{ gestion des courbes INPUT/OUTPUT sur le disque }
procedure Tgraph1dform.SaveAClick(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
 savedialog1.defaultExt:='*.1D';
 savedialog1.filter:='*.1D|*.1D';
 vind:=und.indexof(cocourbe1.text);
{ savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
 savedialog1.fileName:=cocourbe1.text;
 if savedialog1.execute then
 begin
    und.spect[vind].save(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
 end;
end;

procedure Tgraph1dform.SaveBClick(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
 savedialog1.defaultExt:='*.1D';
 savedialog1.filter:='*.1D|*.1D';
 vind:=und.indexof(cocourbe2.text);
{ savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
 savedialog1.fileName:=cocourbe2.text;
 if savedialog1.execute then
 begin
    und.spect[vind].save(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
 end;
end;

procedure Tgraph1dform.SaveCClick(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
 savedialog1.defaultExt:='*.1D';
 savedialog1.filter:='*.1D|*.1D';
 vind:=und.indexof(cocourbe3.text);
{ savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
 savedialog1.fileName:=cocourbe3.text;
 if savedialog1.execute then
 begin
    und.spect[vind].save(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
 end;
end;

procedure Tgraph1dform.SaveDClick(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
 savedialog1.defaultExt:='*.1D';
 savedialog1.filter:='*.1D|*.1D';
 vind:=und.indexof(cocourbe4.text);
{ savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
 savedialog1.fileName:=cocourbe4.text;
 if savedialog1.execute then
 begin
    und.spect[vind].save(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
 end;
end;

procedure Tgraph1dform.ReadAClick(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
begin
  opendialog1.initialDir:=boitnoir.RepertoireManip.text;
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].open(opendialog1.filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);
   end;
end;

procedure Tgraph1dform.ReadBClick(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
begin
  opendialog1.initialDir:=boitnoir.RepertoireManip.text;
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].open(opendialog1.filename);
   cocourbe2.Text:=nom;cocourbe1Change(cocourbe2);
   end;
end;

procedure Tgraph1dform.ReadCClick(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
begin
  opendialog1.initialDir:=boitnoir.RepertoireManip.text;
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].open(opendialog1.filename);
   cocourbe3.Text:=nom;cocourbe1Change(cocourbe3);
   end;
end;

procedure Tgraph1dform.ReadDClick(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
begin
  opendialog1.initialDir:=boitnoir.RepertoireManip.text;
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].open(opendialog1.filename);
   cocourbe4.Text:=nom;cocourbe1Change(cocourbe4);
   end;
end;

{ ============================================================================= }
function  Tgraph1dform.calculeIntegrale:double;
var tot,x,y,rv,Xa,Xb:double;
    chaine:string;
    i,curveIdx:integer;
    flag:boolean;
begin
   xA:=StrToFloat(PosCurseurRouge.text);
   xB:=StrToFloat(PosCurseurBleu.text);
   chaine:=courbeAintegrerBox.text;
   if chaine='A' then curveIdx:=1;
   if chaine='B' then curveIdx:=2;
   if chaine='C' then curveIdx:=3;
   if chaine='D' then curveIdx:=4;
{ on va scanner tous les points de la courbe }
{ et verifier s'ils sont dans l'intervalle }
   tot:=0;
   flag:=xygraph1.series[curveIdx].GetFirstPoint(x, y, rv,i);
   while flag do
   begin if (x>xA) and (x<=xB) then tot:=tot+y;
         flag:=xygraph1.series[curveIdx].GetNextPoint(x, y, rv,i); end;
   result:=tot;
end;


procedure Tgraph1dform.SaveA_ASCIIClick(Sender: TObject);
var vind:integer;
begin
   savedialog1.defaultExt:='*.txt';
   savedialog1.filter:='*.txt|*.txt';
{   savedialog1.filter:='*.1D|*.1D'; }
    vind:=und.indexof(cocourbe1.text);
{    savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
    savedialog1.fileName:=cocourbe1.text;
    und.spect[vind].comment:=Edit5.text;
    if savedialog1.execute then
       und.spect[vind].saveToASCII_2col(savedialog1.filename);
end;

procedure Tgraph1dform.B1Click(Sender: TObject);
var vind:integer;
begin
   savedialog1.defaultExt:='*.txt';
   savedialog1.filter:='*.txt|*.txt';
    vind:=und.indexof(cocourbe2.text);
{    savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
    savedialog1.fileName:=cocourbe2.text;
    if savedialog1.execute then
       und.spect[vind].saveToASCII_2col(savedialog1.filename);
end;

procedure Tgraph1dform.C1Click(Sender: TObject);
var vind:integer;
begin
   savedialog1.defaultExt:='*.txt';
   savedialog1.filter:='*.txt|*.txt';
    vind:=und.indexof(cocourbe3.text);
{    savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
    savedialog1.fileName:=cocourbe3.text;
    if savedialog1.execute then
       und.spect[vind].saveToASCII_2col(savedialog1.filename);
end;

procedure Tgraph1dform.D1Click(Sender: TObject);
var vind:integer;
begin
   savedialog1.defaultExt:='*.txt';
   savedialog1.filter:='*.txt|*.txt';
    vind:=und.indexof(cocourbe4.text);
{    savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
    savedialog1.fileName:=cocourbe4.text;
    if savedialog1.execute then
       und.spect[vind].saveToASCII_2col(savedialog1.filename);
end;

{ ============================================================================= }
procedure Tgraph1dform.Read00AClick(Sender: TObject);
var
  i,j,k,l,n,errorcode:integer;
  nbrPointsExp:integer; { nombre de points expérimentaux }
  indiceValeur:integer; { indice de la valeur dans la ligne de texte }
  F: TextFile;
  S,S1: string[255];
  aux:double;
  finChaine:boolean;
  size:integer;
  comment:string;
  vind:integer;
  nom,ext:string;
  valeurs:valuesVector; { valeurs numériques lues sur la ligne }
begin
  if OpenDialog1.Execute then  { Affichage de la boîte de dialogue d'ouverture }
  begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   AssignFile(F, OpenDialog1.FileName);{ Fichier sélectionné dans la boîte de dialogue }
   Reset(F);
   Size:=0;
   while not(EOF(F)) do begin readln(F,s);inc(size); end;
   size:=size-1; { on saute la première ligne }
   vind:=und.addspectre(nom,size,1,1); { addspectre detruit automatiquement le spectre s'il existait deja }
   und.spect[vind].ExpCondNbr:=0;
   und.spect[vind].comment:=comment;
   reset(F);
   { lecture de l'entete }
   readln(F,comment);
   for i:=0 to Size-1 do
   begin
     { traitement de la chaine pour en extraire les nombres }
     Readln(F, S);    { Lecture de la première ligne du fichier }
     { traitement de la chaine pour en extraire les nombres }
     valeurs:=ProcessString(s);
     und.spect[vind].data[i,0,0].x:=Valeurs[1];
     und.spect[vind].data[i,0,0].z:=Valeurs[2];
   end;
   CloseFile(F);

   cocourbe1.Text:=nom;
   cocourbe1Change(cocourbe1);
   end;
end;

procedure Tgraph1dform.perbox2change(Sender: TObject);
begin
if perbox2.getcheck=1 then xygraph1.series[2].active:=true
else xygraph1.series[2].active:=false;
if perbox2.getcheck=1 then xygraph1.series[6].active:=true
else xygraph1.series[6].active:=false;
end;

procedure Tgraph1dform.perbox3change(Sender: TObject);
begin
if perbox2.getcheck=1 then xygraph1.series[3].active:=true
else xygraph1.series[3].active:=false;
if perbox2.getcheck=1 then xygraph1.series[7].active:=true
else xygraph1.series[7].active:=false;
end;

procedure Tgraph1dform.perbox4change(Sender: TObject);
begin
if perbox2.getcheck=1 then xygraph1.series[4].active:=true
else xygraph1.series[4].active:=false;
if perbox2.getcheck=1 then xygraph1.series[8].active:=true
else xygraph1.series[8].active:=false;
end;

procedure Tgraph1dform.A2Click(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
  savedialog1.defaultExt:='*.nxs';
  savedialog1.filter:='*.nxs|*.nxs';
  vind:=und.indexof(cocourbe1.text);
{  savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
  savedialog1.fileName:=cocourbe1.text;
  if savedialog1.execute then
  begin
    if fileExists(savedialog1.filename)
    then MessageDlg('The file already exists',mtWarning,[mbOk],0)
    else und.spect[vind].saveToNexus(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
  end;
end;

procedure Tgraph1dform.B3Click(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
  savedialog1.defaultExt:='*.nxs';
  savedialog1.filter:='*.nxs|*.nxs';
  vind:=und.indexof(cocourbe2.text);
{  savedialog1.initialDir:=boitnoir.RepertoireManip.text;   }
  savedialog1.fileName:=cocourbe2.text;
  if savedialog1.execute then
  begin
    if fileExists(savedialog1.filename)
    then MessageDlg('The file already exists',mtWarning,[mbOk],0)
    else und.spect[vind].saveToNexus(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
  end;
end;

procedure Tgraph1dform.C3Click(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
  savedialog1.defaultExt:='*.nxs';
  savedialog1.filter:='*.nxs|*.nxs';
  vind:=und.indexof(cocourbe3.text);
{  savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
  savedialog1.fileName:=cocourbe3.text;
  if savedialog1.execute then
  begin
    if fileExists(savedialog1.filename)
    then MessageDlg('The file already exists',mtWarning,[mbOk],0)
    else und.spect[vind].saveToNexus(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
  end;
end;

procedure Tgraph1dform.D3Click(Sender: TObject);
var vind:integer;
    currentDir:string;
begin
  savedialog1.defaultExt:='*.nxs';
  savedialog1.filter:='*.nxs|*.nxs';
  vind:=und.indexof(cocourbe4.text);
{  savedialog1.initialDir:=boitnoir.RepertoireManip.text;   }
  savedialog1.fileName:=cocourbe4.text;
  if savedialog1.execute then
  begin
    if fileExists(savedialog1.filename)
    then MessageDlg('The file already exists',mtWarning,[mbOk],0)
    else und.spect[vind].saveToNexus(savedialog1.filename);
    GetDir(0,CurrentDir);SaveDialog1.initialDir:=CurrentDir;
  end;
end;

procedure Tgraph1dform.A3Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
  opendialog1.defaultExt:='*.nxs';
  opendialog1.filter:='*.nxs|*.nxs';
{  opendialog1.initialDir:=boitnoir.RepertoireManip.text; }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromNeXus(opendialog1.filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;

procedure Tgraph1dform.ReadformNexLLB1Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
  opendialog1.defaultExt:='*.nex';
  opendialog1.filter:='*.nex|*.nex';
{ opendialog1.initialDir:=boitnoir.RepertoireManip.text;   }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromNeXusLLB(opendialog1.filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;

procedure Tgraph1dform.B4Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
  opendialog1.defaultExt:='*.nxs';
  opendialog1.filter:='*.nxs|*.nxs';
{ opendialog1.initialDir:=boitnoir.RepertoireManip.text; }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromNeXus(opendialog1.filename);
   cocourbe2.Text:=nom;cocourbe1Change(cocourbe2);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;

procedure Tgraph1dform.C4Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
  opendialog1.defaultExt:='*.nxs';
  opendialog1.filter:='*.nxs|*.nxs';
{ opendialog1.initialDir:=boitnoir.RepertoireManip.text;   }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromNeXus(opendialog1.filename);
   cocourbe3.Text:=nom;cocourbe1Change(cocourbe3);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;

procedure Tgraph1dform.D4Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentdir:string;
begin
  opendialog1.defaultExt:='*.nxs';
  opendialog1.filter:='*.nxs|*.nxs';
{ opendialog1.initialDir:=boitnoir.RepertoireManip.text; }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromNeXus(opendialog1.filename);
   cocourbe4.Text:=nom;cocourbe1Change(cocourbe4);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;

procedure Tgraph1dform.All1Click(Sender: TObject);
var i,vind:integer;
    name:string;
begin
   for i:=1 to totalspectre do
     if und.spect[i]<>nil then
     begin
       name:=und.spect[i].Nom;
       if (name<>'C1H') and (name<>'C1V')
          and (name<>'C2H') and (name<>'C2V')
          and (name<>'PH') and (name<>'PV')
       then begin
            und.deletespectre(i);
            if cocourbe1.text=name then cocourbe1.text:='C1H';
            if cocourbe2.text=name then cocourbe2.text:='C1V';
            if cocourbe3.text=name then cocourbe3.text:='C2H';
            if cocourbe4.text=name then cocourbe4.text:='C2V';
            end;
     end;
end;

procedure Tgraph1dform.Save1Click(Sender: TObject);
var vind,l,i,j:integer;
    ext,nom:string;
begin
   opendialog1.initialDir:=boitnoir.RepertoireManip.text;
   if opendialog1.execute then
   begin
   {extraction de l'extension}
   l:=length(opendialog1.filename)+1;
   ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';
      vind:=und.indexof(nom);
      if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
{      deuxd.spect[vind].open(opendialog1.filename);        }
      und.spect[vind].readfromfile(opendialog1.filename); { ancienne version }
      {il faut mettre a jour les champs .x et .Y qui sont devenus obligatoires }
      for i:=0 to und.spect[vind].X-1 do begin und.spect[vind].data[i,j,0].X:=i; end;
      und.spect[vind].typeX:='raw';
      cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);
   end;
end;

procedure Tgraph1dform.CopyToClipboard1Click(Sender: TObject);
begin
   XYgraph1.copyToClipboard
end;

procedure Tgraph1dform.AutoSave1Click(Sender: TObject);
begin
   if AutoSave1.checked=true
   then AutoSave1.checked:=false else AutoSave1.checked:=true;
end;

procedure Tgraph1dform.ReadUXD1Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
  opendialog1.defaultExt:='*.uxd';
  opendialog1.filter:='*.uxd|*.uxd';
{ opendialog1.initialDir:=boitnoir.RepertoireManip.text;   }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromUXD(opendialog1.filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;

procedure Tgraph1dform.ReadG41dat1Click(Sender: TObject);
var l,vind:integer;
    nom,ext:string;
    currentDir:string;
begin
  opendialog1.defaultExt:='*.dat';
  opendialog1.filter:='*.dat|*.dat';
{ opendialog1.initialDir:=boitnoir.RepertoireManip.text;   }
  if opendialog1.execute then
   begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   l:=length(opendialog1.filename)+1;ext:='';
   repeat
   l:=l-1;
   ext:=opendialog1.filename[l]+ext;
   until opendialog1.filename[l]='.';
   l:=l-1;
   nom:='';
   repeat
   nom:=opendialog1.filename[l]+nom;
   l:=l-1;
   until opendialog1.filename[l]='\';

   vind:=und.indexof(nom);
   if vind=-1 then vind:=und.addspectre(nom,1,1,1); {creation avec taille arbitraire, le spectre prendra ensuite la taille du fichier}
   und.spect[vind].readFromG41dat(opendialog1.filename);
   cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);

   GetDir(0,CurrentDir);OpenDialog1.initialDir:=CurrentDir;
   end;
end;


{ lecture d'un fichier 2 colonnes                                              }
{ INPUT : fichier 2 colonnes X,intensité                                       }
{ OUTPUT : on le stocke                                                        }
{ REM : pour le moement on utilise une structure 3D spécifique                 }
{ a terme cette structure doit etre intégrée à spectre                         }
{ NB : il faut réféchier au problème du zonage                                 }
procedure Tgraph1dform.ReadFromASCII1Click(Sender: TObject);
var
  i,j,k,n,errorcode:integer;
  indiceValeur:integer; { indice de la valeur dans la ligne de texte }
  F: TextFile;
  S,S1: string[255];
  aux:double;
  valeurs:valuesVector; { valeurs numériques lues sur la ligne }
  finChaine:boolean;
  X,Y,LT:integer;
  comment,nom,ext:string;
  vind,l:integer;
begin
  OpenDialog1.DefaultExt:='*.txt';
  OpenDialog1.Filter:='*.txt';
  if OpenDialog1.Execute then  { Affichage de la boîte de dialogue d'ouverture }
  begin
    AssignFile(F, OpenDialog1.FileName);{ Fichier sélectionné dans la boîte de dialogue }
    Reset(F);
    { lecture de l'entete }
    readln(F,comment);
    { lecture des tailles X,Y,LT }
    readln(F,s);
    X:=strToInt(s);
    Y:=1;LT:=1;
    { il faut redimensionner le spectre 3D et réallouer la memoire }
    {extraction de l'extension}
    nom:=ProcessFileName(opendialog1.filename);

    vind:=und.addspectre(nom,X,Y,LT); { addspectre detruit automatiquement le spectre s'il existait deja }
    und.spect[vind].ExpCondNbr:=0;
    und.spect[vind].comment:=comment;
    k:=0;j:=0;
    for i:=0 to X-1 do
    begin
        Readln(F, S);    { Lecture de la première ligne du fichier }
        { traitement de la chaine pour en extraire les nombres }
        valeurs:=ProcessString(s);
        und.spect[vind].data[i,j,k].x:=Valeurs[1];
        und.spect[vind].data[i,j,k].y:=0;
        und.spect[vind].data[i,j,k].lt:=0;
        und.spect[vind].data[i,j,k].z:=Valeurs[2];
    end;
    CloseFile(F);
    und.spect[vind].ExpCondNbr:=0;
    cocourbe1.Text:=nom;cocourbe1Change(cocourbe1);
  end;
end;

procedure Tgraph1dform.FileTypeButtonClick(Sender: TObject);
begin
   if FileTypeButton.caption='.1D' then FileTypeButton.caption:='.nex'
   else if FileTypeButton.caption='.nex' then FileTypeButton.caption:='.1D';
end;

procedure Tgraph1dform.GetFileButtonClick(Sender: TObject);
var i,imax:integer;
    s,FileNr,directory:string;
    FileFound:boolean;
begin
   FileFound:=false;
   FileNr:=IntToStr(FileNrSpinEdit.Value);
   directory:=boitnoir.RepertoireManip.text;
   FileListBox.Directory:=directory;
   imax:=FileListBox.Items.Count;
   for i:=0 to imax do
   begin
      s:=FileListBox.Items[i];
      if AnsiContainsStr(s,FileNr)
      then begin
           FileFound:=true;
           { ouverture du fichier proprement dite }
           if FileTypeButton.caption='.1D' then openFile1D(directory+'\'+s);
           if FileTypeButton.caption='.nex' then openFileNexusLLB(directory+'\'+s);
{           if FileTypeButton.caption='.dat' then openFilePAXY(directory+'\'+s); }
           break;
           end;
   end;
   If not FileFound then MessageDlg('File not Found', mtInformation,[mbOk], 0);
end;

function Tgraph1dform.calculeMonitor:double;
var tot,x,y,rv,Xa,Xb:double;
    chaine:string;
    i,curveIdx:integer;
    flag:boolean;
begin
   chaine:=courbeAintegrerBox.text;
   if chaine='A' then curveIdx:=und.indexof(cocourbe1.text);
   if chaine='B' then curveIdx:=und.indexof(cocourbe2.text);
   if chaine='C' then curveIdx:=und.indexof(cocourbe3.text);
   if chaine='D' then curveIdx:=und.indexof(cocourbe4.text);
   result:=und.spect[curveIdx].moniteur;
end;

procedure Tgraph1dform.CourbeAintegrerBoxChange(Sender: TObject);
begin
   if CalculationCombo.text='Integral' then integralBox.Value:=calculeIntegrale;
   if CalculationCombo.text='Monitor counts' then integralBox.Value:=calculeMonitor;
end;

procedure Tgraph1dform.CalculationComboChange(Sender: TObject);
begin
   if CalculationCombo.text='Integral' then integralBox.Value:=calculeIntegrale;
   if CalculationCombo.text='Monitor counts' then integralBox.Value:=calculeMonitor;
end;

procedure Tgraph1dform.Displayerrorbarslinscaleonly1Click(Sender: TObject);
begin
     if Displayerrorbarslinscaleonly1.checked=true
     then begin Displayerrorbarslinscaleonly1.checked:=false;
                xygraph1.series[1].drawErrors:=false;
                xygraph1.series[2].drawErrors:=false;
                xygraph1.series[3].drawErrors:=false;
                xygraph1.series[4].drawErrors:=false end
     else begin Displayerrorbarslinscaleonly1.checked:=true;
                xygraph1.series[1].drawErrors:=true;
                xygraph1.series[2].drawErrors:=true;
                xygraph1.series[3].drawErrors:=true;
                xygraph1.series[4].drawErrors:=true end;
end;

{ on calcule les barres d'erreurs pour les courbes affichées                    }
{ on utilise simplement l'erreur statistique                                    }
procedure Tgraph1dform.CalculateErrorBars1Click(Sender: TObject);
var index,i,nbrPoints:integer;
    x,y,r:double;
begin
  for index:=1 to 4 do
  begin
    for i:=0 to nbrPoints-1 do
    begin
      xygraph1.series[index].GetPoint(i,x,y,r);
      xygraph1[index].AddWithError(x,y,0,sqrt(y));
    end;
  end;
end;

procedure Tgraph1dform.SavetoXY1Click(Sender: TObject);
var vind:integer;
    i,j,k:integer;
    fich:textfile;
    s:string;
begin
   savedialog1.defaultExt:='*.XY';
   savedialog1.filter:='*.XY|*.XY';
   vind:=und.indexof(cocourbe1.text);
{    savedialog1.initialDir:=boitnoir.RepertoireManip.text; }
   savedialog1.fileName:=cocourbe1.text;
   und.spect[vind].comment:=Edit5.text;
   if savedialog1.execute then
   begin
     assignfile(fich,savedialog1.FileName);
     rewrite(fich);
     j:=0;k:=0;
     for i:=0 to und.spect[vind].X-1 do
         begin
             s:='';
             s:=FloatToStr(und.spect[vind].data[i,j,k].x)+' ';
             writeln(fich,s+FloatToStr(und.spect[vind].data[i,j,k].z)+' '+FloatToStr(sqrt(und.spect[vind].data[i,j,k].z)));
         end;
     closefile(fich);
     end;
end;

procedure Tgraph1dform.ReadFrom001Click(Sender: TObject);
var
  i,j,k,l,n,errorcode:integer;
  nbrPointsExp:integer; { nombre de points expérimentaux }
  indiceValeur:integer; { indice de la valeur dans la ligne de texte }
  F: TextFile;
  S,S1: string[255];
  aux:double;
  finChaine:boolean;
  size:integer;
  comment:string;
  vind:integer;
  nom,ext:string;
  valeurs:valuesVector; { valeurs numériques lues sur la ligne }
begin
  if OpenDialog1.Execute then  { Affichage de la boîte de dialogue d'ouverture }
  begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   nom:=ProcessFileName(opendialog1.filename);

   AssignFile(F, OpenDialog1.FileName);{ Fichier sélectionné dans la boîte de dialogue }
   Reset(F);
   Size:=0;
   while not(EOF(F)) do begin readln(F,s);inc(size); end;
   size:=size-1; { on saute la première ligne }
   vind:=und.addspectre(nom,size,1,1); { addspectre detruit automatiquement le spectre s'il existait deja }
   und.spect[vind].ExpCondNbr:=0;
   und.spect[vind].comment:=comment;
   reset(F);
   { lecture de l'entete }
   readln(F,comment);
   for i:=0 to Size-1 do
   begin
     { traitement de la chaine pour en extraire les nombres }
     Readln(F, S);    { Lecture de la première ligne du fichier }
     { traitement de la chaine pour en extraire les nombres }
     valeurs:=ProcessString(s);
     und.spect[vind].data[i,0,0].x:=Valeurs[1];
     und.spect[vind].data[i,0,0].z:=Valeurs[2];
   end;
   CloseFile(F);

   cocourbe1.Text:=nom;
   cocourbe1Change(cocourbe1);
   end;
end;

procedure Tgraph1dform.ReadMcStas1Click(Sender: TObject);
var
  i,j,k,l,n,errorcode,n1,n2:integer;
  nbrPointsExp:integer; { nombre de points expérimentaux }
  indiceValeur:integer; { indice de la valeur dans la ligne de texte }
  F: TextFile;
  S,S1: string[255];
  aux:double;
  finChaine:boolean;
  size:integer;
  comment:string;
  vind:integer;
  nom,ext:string;
  valeurs:valuesVector; { valeurs numériques lues sur la ligne }
begin
  if OpenDialog1.Execute then  { Affichage de la boîte de dialogue d'ouverture }
  begin
   {extraction du nom du fichier, lecture de l'arrière vers l'avant }
   nom:=ProcessFileName(opendialog1.filename);
   AssignFile(F, OpenDialog1.FileName);{ Fichier sélectionné dans la boîte de dialogue }
   Reset(F);
   Size:=0;
   Repeat readln(F,s);inc(size);
   until s='Output file: ''mcstas.sci''';
   size:=size-1;
   vind:=und.addspectre(nom,size,1,1); { addspectre detruit automatiquement le spectre s'il existait deja }
   und.spect[vind].ExpCondNbr:=0;und.spect[vind].comment:=comment;
   reset(F);
   { lecture de l'entete }
   for i:=0 to Size-1 do
   begin
     Readln(F, S);
     n1:=AnsiPos('PSD_counter_N',s);
     n2:=AnsiPos('"',s);
     s1:=copy(S,n1+14,n2-n1-14);
     und.spect[vind].data[i,0,0].x:=i;
     und.spect[vind].data[i,0,0].z:=StrToFloat(s1);
   end;
   CloseFile(F);
   cocourbe1.Text:=nom;
   cocourbe1Change(cocourbe1);
   end;
end;

end.


