Statistiques
| Révision:

root / UFCalibrProfilP.pas @ 5

Historique | Voir | Annoter | Télécharger (35,068 ko)

1 3 avalancogn
unit UFCalibrProfilP;
2
3
interface
4
5
uses
6
  Windows, Forms, Classes, Controls, StdCtrls, Dialogs, Buttons, ExtCtrls,
7
  Chart, Series, TeEngine, TeeProcs, JvEnterTab, JvExControls, PBNumEdit,
8
  PBSuperSpin;
9
10
type
11
  TFCalibrProfilP = class(TForm)
12
    BBOk: TBitBtn;
13
    BBCancel: TBitBtn;
14
    SBCalibrage: TSpeedButton;
15
    CBMethod: TComboBox;
16
    Graph: TChart;
17
    GBResults: TGroupBox;
18
    PGraphTop: TPanel;
19
    GBGraphRight: TGroupBox;
20
    CBGraphRight: TComboBox;
21
    GBGraphLeft: TGroupBox;
22
    CBGraphLeft: TComboBox;
23
    LineLeft: TLineSeries;
24
    LineRight: TLineSeries;
25
    PointLeft: TLineSeries;
26
    PointRight: TLineSeries;
27
    GBParam: TGroupBox;
28
    LY50: TLabel;
29
    LY100: TLabel;
30
    LFinal: TLabel;
31
    LInitial: TLabel;
32
    LMeanPD: TLabel;
33
    LSD: TLabel;
34
    EY50Final: TEdit;
35
    ESDY50: TEdit;
36
    EY100Final: TEdit;
37
    ESDY100: TEdit;
38
    EMeanPDFinal: TEdit;
39
    ESDMeanPD: TEdit;
40
    GBVariables: TGroupBox;
41
    LBackfat: TLabel;
42
    LWeight: TLabel;
43
    LR2: TLabel;
44
    LRSD: TLabel;
45
    LVar: TLabel;
46
    Lw: TLabel;
47
    ERSDBackfat: TEdit;
48
    ERSDWeight: TEdit;
49
    ER2Weight: TEdit;
50
    ER2Backfat: TEdit;
51
    EwRSSWeight: TEdit;
52
    EwRSSBackfat: TEdit;
53
    EwBackfat: TEdit;
54
    EwWeight: TEdit;
55
    LFeed: TLabel;
56
    LLean: TLabel;
57
    ERSDFeed: TEdit;
58
    ERSDLean: TEdit;
59
    ER2Lean: TEdit;
60
    ER2Feed: TEdit;
61
    EwRSSLean: TEdit;
62
    EwRSSFeed: TEdit;
63
    EwFeed: TEdit;
64
    EwLean: TEdit;
65
    PButtons: TPanel;
66
    LMethod: TLabel;
67
    LPrecocity: TLabel;
68
    LMaintenance: TLabel;
69
    EPrecocityFinal: TEdit;
70
    ESDPrecocity: TEdit;
71
    EMaintenanceFinal: TEdit;
72
    ESDMaintenance: TEdit;
73
    LTime: TLabel;
74
    ETime: TEdit;
75
    PBIng50: TPBSuperSpin;
76
    PBIng100: TPBSuperSpin;
77
    PBMeanPD: TPBSuperSpin;
78
    PBPrecocity: TPBSuperSpin;
79
    PBMaintenance: TPBSuperSpin;
80
    PLeft: TPanel;
81
    PSummary: TPanel;
82
    EY50Initial: TEdit;
83
    EY100Initial: TEdit;
84
    EMeanPDInitial: TEdit;
85
    EPrecocityInitial: TEdit;
86
    EMaintenanceInitial: TEdit;
87
    PRight: TPanel;
88
    GBParameters: TGroupBox;
89
    LEntretien: TLabel;
90
    LComport: TLabel;
91
    LPDMoy: TLabel;
92
    LIng100: TLabel;
93
    LIng50: TLabel;
94
    LInfo: TLabel;
95
    JvEnterAsTab1: TJvEnterAsTab;
96
    PBwFeed: TPBNumEdit;
97
    PBwWeight: TPBNumEdit;
98
    PBwBackfat: TPBNumEdit;
99
    PBwLean: TPBNumEdit;
100
    RBStandard: TRadioButton;
101
    RBExpert: TRadioButton;
102
    CheckBox6: TCheckBox;
103
    CheckBox7: TCheckBox;
104
    CheckBox8: TCheckBox;
105
    CheckBox9: TCheckBox;
106
    CheckBox10: TCheckBox;
107
    CheckBox1: TCheckBox;
108
    CheckBox2: TCheckBox;
109
    CheckBox3: TCheckBox;
110
    CheckBox4: TCheckBox;
111
    BBReset: TBitBtn;
112
    LPVInit: TLabel;
113
    PBPVInit: TPBSuperSpin;
114
    LInitBW: TLabel;
115
    EInitBWFinal: TEdit;
116
    ESDInitBW: TEdit;
117
    EInitBWInitial: TEdit;
118
    CheckBox5: TCheckBox;
119
    CBAALimit: TCheckBox;
120
    procedure FormCreate(Sender: TObject);
121
    procedure FormDestroy(Sender: TObject);
122
    procedure FormShow(Sender: TObject);
123
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
124
    procedure CBGraphLeftChange(Sender: TObject);
125
    procedure CBGraphRightChange(Sender: TObject);
126
    procedure SBCalibrageClick(Sender: TObject);
127
    procedure PBwFeedChange(Sender: TObject);
128
    procedure PBwWeightChange(Sender: TObject);
129
    procedure PBwBackfatChange(Sender: TObject);
130
    procedure PBwLeanChange(Sender: TObject);
131
    procedure PBIng50Change(Sender: TObject);
132
    procedure PBIng100Change(Sender: TObject);
133
    procedure PBMeanPDChange(Sender: TObject);
134
    procedure PBPrecocityChange(Sender: TObject);
135
    procedure PBMaintenanceChange(Sender: TObject);
136
    procedure RBStandardClick(Sender: TObject);
137
    procedure RBExpertClick(Sender: TObject);
138
    procedure BBResetClick(Sender: TObject);
139
    procedure PBPVInitChange(Sender: TObject);
140
  private
141
    { D?clarations priv?es }
142
    procedure Calibration;
143
    procedure Uncheck;
144
  public
145
    { D?clarations publiques }
146
  end;
147
148
var
149
  FCalibrProfilP: TFCalibrProfilP;
150
151
implementation
152
153
uses
154
  SysUtils, gnugettext, dmath, UVariables, UStrings, UInit, UCalcul, UFindRec,
155
  UEchelle, UFProfilP, UCalcSimulP;
156
157
{$R *.dfm}
158
159
{ Calibration }
160
161
const
162
  MaxIter = 100;
163
  Tol = MICRO;
164
165
type
166
  RecCalibr = record
167
    Age: Integer;
168
    Id: Integer; // 1=Feed, 2=Weight, 3=Backfat, 4=Lean
169
    Observ: Extended;
170
    Predict: Extended;
171
  end;
172
  PRecCalibr = ^RecCalibr;
173
174
var
175
  MiseAJour, PDLimit: boolean;
176
  PProfilTempo: PRecProfilP;
177
  IdxProfilTempo: Integer;
178
  PResSimulTempo: PTabResSimulP;
179
  ListRecCalibr: TList;
180
  NVar, NVarDep, NData: Integer;
181
  X, G: TVector;
182
  H_inv: TMatrix;
183
  F_min, Det: Float;
184
  Inv: array[1..6] of Float;
185
  Freq, Start, Stop: Int64;
186
  Nb: array[1..4] of Integer;
187
  Tot, M, w, SSt, SSr, wSSr: array[1..4] of Double;
188
  wSSrTot: Double;
189
190
function Func(X: TVector): Float;
191
var
192
  i, jour: Integer;
193
  Y50, Y100, cumul: Double;
194
  rec: PRecCalibr;
195
begin
196
  i := 0;
197
  if FCalibrProfilP.CheckBox5.Checked
198
  then
199
  begin
200
    Inc(i);
201
    if X[i] <= 0
202
    then // Protection rajout?e le 27/07/2011
203
      PProfilTempo.PVInit := MILLI
204
    else
205
      PProfilTempo.PVInit := X[i];
206
    // Recalculer les poids initiaux de prot?ines et lipides
207
    PProfilTempo.ProtInit := CalcProt(PProfilTempo.PVInit);
208
    PProfilTempo.LipInit := CalcLipProt(PProfilTempo.PVInit, PProfilTempo.ProtInit);
209
  end;
210
  if FCalibrProfilP.CheckBox6.Checked
211
  then
212
  begin
213
    Inc(i);
214
    Y50 := X[i];
215
  end
216
  else
217
    Y50 := FCalibrProfilP.PBIng50.AsFloat;
218
  if FCalibrProfilP.CheckBox7.Checked
219
  then
220
  begin
221
    Inc(i);
222
    Y100 := X[i];
223
  end
224
  else
225
    Y100 := FCalibrProfilP.PBIng100.AsFloat;
226
  if FCalibrProfilP.CheckBox8.Checked
227
  then
228
  begin
229
    Inc(i);
230
    if X[i] <= 0
231
    then // Protection rajout?e le 27/07/2011
232
      PProfilTempo.PDMoy := MILLI
233
    else
234
      PProfilTempo.PDMoy := X[i];
235
  end;
236
  if FCalibrProfilP.CheckBox9.Checked
237
  then
238
  begin
239
    Inc(i);
240
    if X[i] <= 0
241
    then // Protection rajout?e le 27/07/2011
242
      PProfilTempo.BGompertz := MILLI
243
    else
244
      PProfilTempo.BGompertz := X[i];
245
  end;
246
  if FCalibrProfilP.CheckBox10.Checked
247
  then
248
  begin
249
    Inc(i);
250
    if X[i] <= 0
251
    then // Protection rajout?e le 27/07/2011
252
      PProfilTempo.Entretien := MILLI
253
    else
254
      PProfilTempo.Entretien := X[i];
255
  end;
256
  with PProfilTempo^ do
257
    try
258
      CalcCoef(Equation, Unite, Y50, Y100, a, b);
259
    except
260
      a := 0;
261
      b := 0;
262
    end;
263
  // Valeur des param?tres du cas ?valu?
264
  MiseAJour := True;
265
  FCalibrProfilP.PBPVInit.AsFloat := PProfilTempo.PVInit;
266
  FCalibrProfilP.PBIng50.AsFloat := Y50;
267
  FCalibrProfilP.PBIng100.AsFloat := Y100;
268
  FCalibrProfilP.PBMeanPD.AsFloat := PProfilTempo.PDMoy;
269
  FCalibrProfilP.PBPrecocity.AsFloat := PProfilTempo.BGompertz;
270
  FCalibrProfilP.PBMaintenance.AsFloat := PProfilTempo.Entretien;
271
  MiseAJour := False;
272
  try
273
    // Affichage de la simulation
274
    CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, FCalibrProfilP.CBAALimit.Checked);
275
    {
276
    // Affichage des graphiques
277
    FCalibrProfilP.CBGraphLeftChange(nil);
278
    FCalibrProfilP.CBGraphRightChange(nil);
279
    Application.ProcessMessages;
280
    }
281
  except // La simulation a ?chou?
282
    for i := 0 to ListRecCalibr.Count - 1 do
283
    begin
284
      rec := ListRecCalibr[i];
285
      rec.Predict := 0;
286
    end;
287
  end;
288
  // Evaluation du cas
289
  PDLimit := False;
290
  i := 0;
291
  rec := ListRecCalibr[i];
292
  cumul := 0;
293
  for jour := 1 to PResSimulTempo.NbJSim do
294
  begin
295
    while (i < ListRecCalibr.Count) and (PResSimulTempo.TabResult[1, jour] = rec.Age) do
296
    begin
297
      case rec.Id of
298
        1: // Feed
299
          rec.Predict := cumul;
300
        2: // Weight
301
          rec.Predict := PResSimulTempo.TabResult[2, jour];
302
        3: // Backfat
303
          if FatInfo = 0
304
          then // P2
305
            rec.Predict := CalcP2(PResSimulTempo.TabResult[50, jour])
306
          else // User defined
307
            rec.Predict := CalcUserFat(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour]);
308
        4: // Lean
309
          if LeanInfo = 0
310
          then // TMP
311
            rec.Predict := CalcTMP(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour])
312
          else // User defined
313
            rec.Predict := CalcUserLean(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour]);
314
      end;
315
      Inc(i);
316
      if i < ListRecCalibr.Count then rec := ListRecCalibr[i];
317
    end;
318
    cumul := cumul + PResSimulTempo.TabResult[113, jour];
319
    if PResSimulTempo.TabResult[47, jour] < PResSimulTempo.TabResult[77, jour] / GEProtJaap
320
    then // PDFirstLimit < PD potentiel
321
      PDLimit := True;
322
  end;
323
  // Ecart par rapport aux valeurs du profil
324
  Result := 0;
325
  for i := 0 to ListRecCalibr.Count - 1 do
326
  begin
327
    rec := ListRecCalibr[i];
328
    case rec.Id of
329
      1: // Feed
330
        if FCalibrProfilP.CheckBox1.Checked
331
        then
332
          Result := Result + w[1] * Power(rec.Observ - rec.Predict, 2);
333
      2: // Weight
334
        if FCalibrProfilP.CheckBox2.Checked
335
        then
336
          Result := Result + w[2] * Power(rec.Observ - rec.Predict, 2);
337
      3: // Backfat
338
        if FCalibrProfilP.CheckBox3.Checked
339
        then
340
          Result := Result + w[3] * Power(rec.Observ - rec.Predict, 2);
341
      4: // Lean
342
        if FCalibrProfilP.CheckBox4.Checked
343
        then
344
          Result := Result + w[4] * Power(rec.Observ - rec.Predict, 2);
345
    end;
346
  end;
347
end;
348
349
// Newton-Raphson method
350
// procedure HessGrad to compute the gradient G and the hessian H of the function at point X
351
{$I numhess.inc}
352
353
// Broyden-Fletcher-Goldfarb-Shanno method
354
// procedure Gradient to compute the gradient G of the function at point X
355
{$I numgrad.inc}
356
357
{ TFCalibrProfilP }
358
359
procedure TFCalibrProfilP.BBResetClick(Sender: TObject);
360
begin
361
  FormShow(Sender);
362
  BBOk.Enabled := False;
363
end;
364
365
procedure TFCalibrProfilP.Calibration;
366
var
367
  i: Integer;
368
begin
369
  // Initialisation des structures
370
  NVarDep := 0;
371
  if CheckBox1.Checked then Inc(NVarDep);
372
  if CheckBox2.Checked then Inc(NVarDep);
373
  if CheckBox3.Checked then Inc(NVarDep);
374
  if CheckBox4.Checked then Inc(NVarDep);
375
  NData := 0;
376
  if CheckBox1.Checked then NData := NData + Nb[1];
377
  if CheckBox2.Checked then NData := NData + Nb[2];
378
  if CheckBox3.Checked then NData := NData + Nb[3];
379
  if CheckBox4.Checked then NData := NData + Nb[4];
380
  NVar := 0;
381
  if CheckBox5.Checked then Inc(NVar);
382
  if CheckBox6.Checked then Inc(NVar);
383
  if CheckBox7.Checked then Inc(NVar);
384
  if CheckBox8.Checked then Inc(NVar);
385
  if CheckBox9.Checked then Inc(NVar);
386
  if CheckBox10.Checked then Inc(NVar);
387
  DimVector(X, NVar);
388
  DimVector(G, NVar);
389
  DimMatrix(H_inv, NVar, NVar);
390
  i := 0;
391
  if CheckBox5.Checked
392
  then
393
  begin
394
    Inc(i);
395
    X[i] := PBPVInit.AsFloat;
396
  end;
397
  if CheckBox6.Checked
398
  then
399
  begin
400
    Inc(i);
401
    X[i] := PBIng50.AsFloat;
402
  end;
403
  if CheckBox7.Checked
404
  then
405
  begin
406
    Inc(i);
407
    X[i] := PBIng100.AsFloat;
408
  end;
409
  if CheckBox8.Checked
410
  then
411
  begin
412
    Inc(i);
413
    X[i] := PBMeanPD.AsFloat;
414
  end;
415
  if CheckBox9.Checked
416
  then
417
  begin
418
    Inc(i);
419
    X[i] := PBPrecocity.AsFloat;
420
  end;
421
  if CheckBox10.Checked
422
  then
423
  begin
424
    Inc(i);
425
    X[i] := PBMaintenance.AsFloat;
426
  end;
427
  case CBMethod.ItemIndex of
428
    0: Newton(Func, HessGrad, X, 1, NVar, MaxIter, Tol, F_min, G, H_inv, Det);
429
    1: Marquardt(Func, HessGrad, X, 1, NVar, MaxIter, Tol, F_min, G, H_inv, Det);
430
    2: BFGS(Func, Gradient, X, 1, NVar, MaxIter, Tol, F_min, G, H_inv);
431
  end;
432
  for i := 1 to NVar do
433
    Inv[i] := H_inv[i, i];
434
end;
435
436
procedure TFCalibrProfilP.CBGraphLeftChange(Sender: TObject);
437
var
438
  jour, i: Integer;
439
  cumul, x, y: Double;
440
  rec: PRecCalibr;
441
begin
442
  Graph.LeftAxis.Title.Caption := CBGraphLeft.Text;
443
  // Ligne
444
  LineLeft.Clear;
445
  cumul := 0;
446
  for jour := 1 to PResSimulTempo.NbJSim do
447
  begin
448
    x := PResSimulTempo.TabResult[1, jour];
449
    case CBGraphLeft.ItemIndex of
450
      0: // Cumulative feed usage
451
      begin
452
        y := cumul;
453
        cumul := cumul + PResSimulTempo.TabResult[113, jour];
454
      end;
455
      1: // Body weight
456
        y := PResSimulTempo.TabResult[2, jour];
457
      2: // Backfat thickness
458
        if FatInfo = 0
459
        then // P2
460
          y := CalcP2(PResSimulTempo.TabResult[50, jour])
461
        else // User defined
462
          y := CalcUserFat(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour]);
463
      3: // Lean meat percentage
464
        if LeanInfo = 0
465
        then // TMP
466
          y := CalcTMP(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour])
467
        else // User defined
468
          y := CalcUserLean(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour]);
469
      else
470
        y := 0;
471
    end;
472
    LineLeft.AddXY(x, y, '', clTeeColor);
473
  end;
474
  // Points
475
  PointLeft.Clear;
476
  for i := 0 to ListRecCalibr.Count - 1 do
477
  begin
478
    rec := ListRecCalibr[i];
479
    if rec.Id = CBGraphLeft.ItemIndex + 1
480
    then
481
    begin
482
      x := rec.Age;
483
      y := rec.Observ;
484
      PointLeft.AddXY(x, y, '', clTeeColor);
485
    end;
486
  end;
487
  AjustEchelle(Graph);
488
end;
489
490
procedure TFCalibrProfilP.CBGraphRightChange(Sender: TObject);
491
var
492
  jour, i: Integer;
493
  cumul, x, y: Double;
494
  rec: PRecCalibr;
495
begin
496
  Graph.RightAxis.Title.Caption := CBGraphRight.Text;
497
  // Ligne
498
  LineRight.Clear;
499
  cumul := 0;
500
  for jour := 1 to PResSimulTempo.NbJSim do
501
  begin
502
    x := PResSimulTempo.TabResult[1, jour];
503
    case CBGraphRight.ItemIndex of
504
      0: // Cumulative feed usage
505
      begin
506
        y := cumul;
507
        cumul := cumul + PResSimulTempo.TabResult[113, jour];
508
      end;
509
      1: // Body weight
510
        y := PResSimulTempo.TabResult[2, jour];
511
      2: // Backfat thickness
512
        if FatInfo = 0
513
        then // P2
514
          y := CalcP2(PResSimulTempo.TabResult[50, jour])
515
        else // User defined
516
          y := CalcUserFat(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour]);
517
      3: // Lean meat percentage
518
        if LeanInfo = 0
519
        then // TMP
520
          y := CalcTMP(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour])
521
        else // User defined
522
          y := CalcUserLean(PResSimulTempo.TabResult[48, jour], PResSimulTempo.TabResult[49, jour], PResSimulTempo.TabResult[50, jour]);
523
      else
524
        y := 0;
525
    end;
526
    LineRight.AddXY(x, y, '', clTeeColor);
527
  end;
528
  // Points
529
  PointRight.Clear;
530
  for i := 0 to ListRecCalibr.Count - 1 do
531
  begin
532
    rec := ListRecCalibr[i];
533
    if rec.Id = CBGraphRight.ItemIndex + 1
534
    then
535
    begin
536
      x := rec.Age;
537
      y := rec.Observ;
538
      PointRight.AddXY(x, y, '', clTeeColor);
539
    end;
540
  end;
541
  AjustEchelle(Graph);
542
end;
543
544
procedure TFCalibrProfilP.FormClose(Sender: TObject; var Action: TCloseAction);
545
begin
546
  PProfilP := ListProfilP[FindIdxProfilP(FProfilP.CBProfil.Text)];
547
  if ModalResult = mrOk
548
  then // Conserver les modification
549
  begin
550
    PProfilP.AgeInit := PProfilTempo.AgeInit;
551
    PProfilP.PVInit := PProfilTempo.PVInit;
552
    PProfilP.ProtInit := PProfilTempo.ProtInit;
553
    PProfilP.LipInit := PProfilTempo.LipInit;
554
    PProfilP.ModeFin := 0; // Dur?e
555
    PProfilP.Duree := PProfilTempo.Duree;
556
    PProfilP.a := PProfilTempo.a;
557
    PProfilP.b := PProfilTempo.b;
558
    PProfilP.PDMoy := PProfilTempo.PDMoy;
559
    PProfilP.BGompertz := PProfilTempo.BGompertz;
560
    PProfilP.Entretien := PProfilTempo.Entretien;
561
  end;
562
end;
563
564
procedure TFCalibrProfilP.FormCreate(Sender: TObject);
565
begin
566
  if Screen.Fonts.IndexOf('Arial Unicode MS') <> -1
567
  then
568
    Font.Name := 'Arial Unicode MS';
569
  TranslateComponent(Self);
570
  CBGraphLeft.ItemIndex := 0; // Cumulative feed usage
571
  CBGraphRight.ItemIndex := 1; // Body weight
572
  CBMethod.ItemIndex := 1; // Marquardt
573
  Graph.BottomAxis.Title.Caption := _('Age (d)');
574
  MiseAJour := True;
575
  PBIng50.Decimals := FProfilP.PBIng50.Decimals;
576
  PBIng50.Increment := FProfilP.PBIng50.Increment;
577
  PBIng100.Decimals := FProfilP.PBIng100.Decimals;
578
  PBIng100.Increment := FProfilP.PBIng100.Increment;
579
  MiseAJour := False;
580
  New(PProfilTempo);
581
  IdxProfilTempo := ListProfilP.Add(PProfilTempo);
582
  New(PResSimulTempo);
583
  ListRecCalibr := TList.Create;
584
end;
585
586
procedure TFCalibrProfilP.FormDestroy(Sender: TObject);
587
var
588
  i: Integer;
589
  rec: PRecCalibr;
590
begin
591
  for i := 0 to ListRecCalibr.Count - 1 do
592
  begin
593
    rec := ListRecCalibr[i];
594
    Dispose(rec);
595
  end;
596
  ListRecCalibr.Free;
597
  ListProfilP.Delete(IdxProfilTempo);
598
  Dispose(PProfilTempo);
599
  Dispose(PResSimulTempo);
600
end;
601
602
procedure TFCalibrProfilP.FormShow(Sender: TObject);
603
var
604
  i: Integer;
605
  rec: PRecCalibr;
606
  wTot: Double;
607
  AgeInit: Integer;
608
  PVInit: Double;
609
begin
610
  // Lecture des observations
611
  for i := 1 to 4 do
612
  begin
613
    Nb[i] := 0;
614
    Tot[i] := 0;
615
    M[i] := 0;
616
    w[i] := 0;
617
  end;
618
  while ListRecCalibr.Count > 0 do
619
  begin
620
    rec := ListRecCalibr[0];
621
    Dispose(rec);
622
    ListRecCalibr.Delete(0);
623
  end;
624
  with FProfilP.ASQLite3TableObservProfilP do
625
  begin
626
    First;
627
    AgeInit := FieldByName('Age').AsInteger;
628
    PVInit := FieldByName('Weight').AsFloat;
629
    while not Eof do
630
    begin
631
      if (FieldByName('Line').AsInteger > 1) and not FieldByName('Feed').IsNull
632
      then
633
      begin
634
        Inc(Nb[1]);
635
        Tot[1] := Tot[1] + FieldByName('Feed').AsFloat;
636
        New(rec);
637
        rec.Age := FieldByName('Age').AsInteger;
638
        rec.Id := 1;
639
        rec.Observ := FieldByName('Feed').AsFloat;
640
        ListRecCalibr.Add(rec);
641
      end;
642
      if not FieldByName('Weight').IsNull
643
      then
644
      begin
645
        Inc(Nb[2]);
646
        Tot[2] := Tot[2] + FieldByName('Weight').AsFloat;
647
        New(rec);
648
        rec.Age := FieldByName('Age').AsInteger;
649
        rec.Id := 2;
650
        rec.Observ := FieldByName('Weight').AsFloat;
651
        ListRecCalibr.Add(rec);
652
      end;
653
      if not FieldByName('Backfat').IsNull
654
      then
655
      begin
656
        Inc(Nb[3]);
657
        Tot[3] := Tot[3] + FieldByName('Backfat').AsFloat;
658
        New(rec);
659
        rec.Age := FieldByName('Age').AsInteger;
660
        rec.Id := 3;
661
        rec.Observ := FieldByName('Backfat').AsFloat;
662
        ListRecCalibr.Add(rec);
663
      end;
664
      if not FieldByName('Lean').IsNull
665
      then
666
      begin
667
        Inc(Nb[4]);
668
        Tot[4] := Tot[4] + FieldByName('Lean').AsFloat;
669
        New(rec);
670
        rec.Age := FieldByName('Age').AsInteger;
671
        rec.Id := 4;
672
        rec.Observ := FieldByName('Lean').AsFloat;
673
        ListRecCalibr.Add(rec);
674
      end;
675
      Next;
676
    end;
677
  end;
678
  // Moyennes observations
679
  for i := 1 to 4 do
680
    if Nb[i] <> 0 then M[i] := Tot[i] / Nb[i];
681
  // Pond?rations observations
682
  for i := 1 to 4 do
683
    if M[i] <> 0 then w[i] := 1 / (Nb[i] * Power(M[i], 2));
684
  // R?ajustement des pond?rations en fonction de la pond?ration totale
685
  wTot := 0;
686
  for i := 1 to 4 do
687
    wTot := wTot + w[i];
688
  for i := 1 to 4 do
689
    w[i] := w[i] / wTot;
690
  // Affichage des variables d?pendantes
691
  PBwFeed.AsFloat := w[1];
692
  EwFeed.Text := PBwFeed.Text;
693
  PBwWeight.AsFloat := w[2];
694
  EwWeight.Text := PBwWeight.Text;
695
  if Nb[3] = 0
696
  then
697
  begin
698
    EwBackfat.Enabled := False;
699
    ERSDBackfat.Enabled := False;
700
    ER2Backfat.Enabled := False;
701
    EwRSSBackfat.Enabled := False;
702
    PBwBackfat.Enabled := False;
703
    CheckBox3.Enabled := False;
704
  end
705
  else
706
  begin
707
    PBwBackfat.AsFloat := w[3];
708
    EwBackfat.Text := PBwBackfat.Text;
709
  end;
710
  if Nb[4] = 0
711
  then
712
  begin
713
    EwLean.Enabled := False;
714
    ERSDLean.Enabled := False;
715
    ER2Lean.Enabled := False;
716
    EwRSSLean.Enabled := False;
717
    PBwLean.Enabled := False;
718
    CheckBox4.Enabled := False;
719
  end
720
  else
721
  begin
722
    PBwLean.AsFloat := w[4];
723
    EwLean.Text := PBwLean.Text;
724
  end;
725
  // Initialisation des param?tres avec les valeurs du profil
726
  MiseAJour := True;
727
  PBPVInit.AsFloat := PVInit;
728
  PBIng50.AsFloat := FProfilP.PBIng50.AsFloat;
729
  PBIng100.AsFloat := FProfilP.PBIng100.AsFloat;
730
  PBMeanPD.AsFloat := FProfilP.PBPDMoy.AsFloat;
731
  PBPrecocity.AsFloat := FProfilP.PBComport.AsFloat;
732
  PBMaintenance.AsFloat := FProfilP.PBEntretien.AsFloat;
733
  MiseAJour := False;
734
  PProfilP := ListProfilP[FindIdxProfilP(FProfilP.CBProfil.Text)];
735
  // Initialisation du profil temporaire
736
  PProfilTempo.Num := 0;
737
  PProfilTempo.Nom := '';
738
  PProfilTempo.Memo := '';
739
  PProfilTempo.Sexe := PProfilP.Sexe;
740
  PProfilTempo.SeqAli := PProfilP.SeqAli;
741
  PProfilTempo.Ration := PProfilP.Ration;
742
  PProfilTempo.AgeInit := AgeInit;
743
  PProfilTempo.PVInit := PVInit;
744
  if PVInit <> PProfilP.PVInit
745
  then // Recalculer les poids initiaux de prot?ines et lipides
746
  begin
747
    PProfilTempo.ProtInit := CalcProt(PVInit);
748
    PProfilTempo.LipInit := CalcLipProt(PVInit, PProfilTempo.ProtInit);
749
  end
750
  else // Utiliser les poids initiaux de prot?ines et lipides du profil
751
  begin
752
    PProfilTempo.ProtInit := PProfilP.ProtInit;
753
    PProfilTempo.LipInit := PProfilP.LipInit;
754
  end;
755
  PProfilTempo.ModeFin := 0; // Dur?e
756
  rec := ListRecCalibr[ListRecCalibr.Count - 1];
757
  PProfilTempo.Duree := rec.Age - AgeInit + 1;
758
  PProfilTempo.PVFin := 0;
759
  PProfilTempo.Carcasse := PProfilP.Carcasse;
760
  PProfilTempo.Unite := PProfilP.Unite;
761
  PProfilTempo.Equation := PProfilP.Equation;
762
  PProfilTempo.a := PProfilP.a;
763
  PProfilTempo.b := PProfilP.b;
764
  PProfilTempo.PDMoy := PProfilP.PDMoy;
765
  PProfilTempo.BGompertz := PProfilP.BGompertz;
766
  PProfilTempo.Entretien := PProfilP.Entretien;
767
  PProfilTempo.PVmr2 := PProfilP.PVmr2;
768
  if ProfilPValid(PProfilTempo)
769
  then // Affichage de la simulation
770
  begin
771
    CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
772
    CBGraphLeftChange(nil);
773
    CBGraphRightChange(nil);
774
  end;
775
end;
776
777
procedure TFCalibrProfilP.SBCalibrageClick(Sender: TObject);
778
var
779
  i: Integer;
780
  rec: PRecCalibr;
781
begin
782
  // Effacement des statistiques
783
  ERSDFeed.Clear;
784
  ERSDWeight.Clear;
785
  ERSDBackfat.Clear;
786
  ERSDLean.Clear;
787
  ER2Feed.Clear;
788
  ER2Weight.Clear;
789
  ER2Backfat.Clear;
790
  ER2Lean.Clear;
791
  EwRSSFeed.Clear;
792
  EwRSSWeight.Clear;
793
  EwRSSBackfat.Clear;
794
  EwRSSLean.Clear;
795
  EInitBWInitial.Clear;
796
  EY50Initial.Clear;
797
  EY100Initial.Clear;
798
  EMeanPDInitial.Clear;
799
  EPrecocityInitial.Clear;
800
  EMaintenanceInitial.Clear;
801
  EInitBWFinal.Clear;
802
  EY50Final.Clear;
803
  EY100Final.Clear;
804
  EMeanPDFinal.Clear;
805
  EPrecocityFinal.Clear;
806
  EMaintenanceFinal.Clear;
807
  ESDInitBW.Clear;
808
  ESDY50.Clear;
809
  ESDY100.Clear;
810
  ESDMeanPD.Clear;
811
  ESDPrecocity.Clear;
812
  ESDMaintenance.Clear;
813
  // Valeurs initiales des param?tres
814
  EInitBWInitial.Text := PBPVInit.Text;
815
  EY50Initial.Text := PBIng50.Text;
816
  EY100Initial.Text := PBIng100.Text;
817
  EMeanPDInitial.Text := PBMeanPD.Text;
818
  EPrecocityInitial.Text := PBPrecocity.Text;
819
  EMaintenanceInitial.Text := PBMaintenance.Text;
820
  // Calibration
821
  Screen.Cursor := crHourGlass;
822
  if not QueryPerformanceFrequency(Freq) then Freq := 1;
823
  QueryPerformanceCounter(Start);
824
  if RBStandard.Checked
825
  then // Mode standard (automatique)
826
  begin
827
    // Cycle 1 : Feed -> Y50 + Y100
828
    Uncheck;
829
    CheckBox1.Checked := True; // Feed
830
    CheckBox6.Checked := True; // Y50
831
    CheckBox7.Checked := True; // Y100
832
    Calibration;
833
    // Cycle 2 : Weight -> PVInit + PDMean
834
    Uncheck;
835
    CheckBox2.Checked := True; // Weight
836
    CheckBox5.Checked := True; // PVInit
837
    CheckBox8.Checked := True; // PDMean
838
    // Cycle 3 : Feed + Weight -> PVInit + Y50 + Y100 + PDMean
839
    CheckBox1.Checked := True; // Feed
840
    CheckBox6.Checked := True; // Y50
841
    CheckBox7.Checked := True; // Y100
842
    Calibration;
843
    // Cycle 4 : Weight -> PVInit + PDMean + Precocity
844
    Uncheck;
845
    CheckBox2.Checked := True; // Weight
846
    CheckBox5.Checked := True; // PVInit
847
    CheckBox8.Checked := True; // PDMean
848
    CheckBox9.Checked := True; // Precocity
849
    Calibration;
850
    // Cycle 5 : Feed + Weight -> PVInit + Y50 + Y100 + PDMean + Precocity
851
    CheckBox1.Checked := True; // Feed
852
    CheckBox6.Checked := True; // Y50
853
    CheckBox7.Checked := True; // Y100
854
    Calibration;
855
  end
856
  else // Mode expert (mannuel)
857
    Calibration;
858
  Screen.Cursor:= crDefault;
859
  QueryPerformanceCounter(Stop);
860
  ETime.Text := FloatToStrF((Stop - Start) / Freq, ffFixed, 15, 3);
861
  // Valeurs finales des param?tres
862
  EInitBWFinal.Text := PBPVInit.Text;
863
  EY50Final.Text := PBIng50.Text;
864
  EY100Final.Text := PBIng100.Text;
865
  EMeanPDFinal.Text := PBMeanPD.Text;
866
  EPrecocityFinal.Text := PBPrecocity.Text;
867
  EMaintenanceFinal.Text := PBMaintenance.Text;
868
  // Affichage des graphiques
869
  FCalibrProfilP.CBGraphLeftChange(nil);
870
  FCalibrProfilP.CBGraphRightChange(nil);
871
  // Calcul des statistiques
872
  for i := 1 to 4 do
873
  begin
874
    SSt[i] := 0;
875
    SSr[i] := 0;
876
    wSSr[i] := 0;
877
  end;
878
  for i := 0 to ListRecCalibr.Count - 1 do
879
  begin
880
    rec := ListRecCalibr[i];
881
    case rec.Id of
882
      1: // Feed
883
        if FCalibrProfilP.CheckBox1.Checked
884
        then
885
        begin
886
          SSt[1] := SSt[1] + Power(rec.Observ - M[1], 2);
887
          SSr[1] := SSr[1] + Power(rec.Observ - rec.Predict, 2);
888
          wSSr[1] := wSSr[1] + Power(rec.Observ - rec.Predict, 2) * w[1];
889
        end;
890
      2: // Weight
891
        if FCalibrProfilP.CheckBox2.Checked
892
        then
893
        begin
894
          SSt[2] := SSt[2] + Power(rec.Observ - M[2], 2);
895
          SSr[2] := SSr[2] + Power(rec.Observ - rec.Predict, 2);
896
          wSSr[2] := wSSr[2] + Power(rec.Observ - rec.Predict, 2) * w[2];
897
        end;
898
      3: // Backfat
899
        if FCalibrProfilP.CheckBox3.Checked
900
        then
901
        begin
902
          SSt[3] := SSt[3] + Power(rec.Observ - M[3], 2);
903
          SSr[3] := SSr[3] + Power(rec.Observ - rec.Predict, 2);
904
          wSSr[3] := wSSr[3] + Power(rec.Observ - rec.Predict, 2) * w[3];
905
        end;
906
      4: // Lean
907
        if FCalibrProfilP.CheckBox4.Checked
908
        then
909
        begin
910
          SSt[4] := SSt[4] + Power(rec.Observ - M[4], 2);
911
          SSr[4] := SSr[4] + Power(rec.Observ - rec.Predict, 2);
912
          wSSr[4] := wSSr[4] + Power(rec.Observ - rec.Predict, 2) * w[4];
913
        end;
914
    end;
915
  end;
916
  wSSrTot := 0;
917
  for i := 1 to 4 do
918
    wSSrTot := wSSrTot + wSSr[i];
919
  // Affichage des statistiques
920
  if CheckBox1.Checked
921
  then
922
  begin
923
    if Nb[1] > NVar / NVarDep then ERSDFeed.Text := Format('%1.1f %s', [Sqrt(SSr[1] / (Nb[1] - NVar / NVarDep)), StrKg]);
924
    if SSt[1] <> 0 then ER2Feed.Text := Format('%1.2f %%', [100 - SSr[1] / SSt[1] * 100]);
925
    if wSSrTot <> 0 then EwRSSFeed.Text := Format('%1.2f %%', [wSSr[1] / wSSrTot * 100]);
926
  end;
927
  if CheckBox2.Checked
928
  then
929
  begin
930
    if Nb[2] > NVar / NVarDep then ERSDWeight.Text := Format('%1.1f %s', [Sqrt(SSr[2] / (Nb[2] - NVar / NVarDep)), StrKg]);
931
    if SSt[2] <> 0 then ER2Weight.Text := Format('%1.2f %%', [100 - SSr[2] / SSt[2] * 100]);
932
    if wSSrTot <> 0 then EwRSSWeight.Text := Format('%1.2f %%', [wSSr[2] / wSSrTot * 100]);
933
  end;
934
  if CheckBox3.Checked
935
  then
936
  begin
937
    if Nb[3] > NVar / NVarDep then ERSDBackfat.Text := Format('%1.1f %s', [Sqrt(SSr[3] / (Nb[3] - NVar / NVarDep)), StrMM]);
938
    if SSt[3] <> 0 then ER2Backfat.Text := Format('%1.2f %%', [100 - SSr[3] / SSt[3] * 100]);
939
    if wSSrTot <> 0 then EwRSSBackfat.Text := Format('%1.2f %%', [wSSr[3] / wSSrTot * 100]);
940
  end;
941
  if CheckBox4.Checked
942
  then
943
  begin
944
    if Nb[4] > NVar / NVarDep then ERSDLean.Text := Format('%1.1f %%', [Sqrt(SSr[4] / (Nb[4] - NVar / NVarDep))]);
945
    if SSt[4] <> 0 then ER2Lean.Text := Format('%1.2f %%', [100 - SSr[4] / SSt[4] * 100]);
946
    if wSSrTot <> 0 then EwRSSLean.Text := Format('%1.2f %%', [wSSr[4] / wSSrTot * 100]);
947
  end;
948
  i := 0;
949
  if CheckBox5.Checked
950
  then
951
  begin
952
    Inc(i);
953
    if NData > NVar then ESDInitBW.Text := FloatToStrF(Sqrt(wSSrTot / (NData - NVar) * Inv[i]), ffFixed, 15, PBPVInit.Decimals);
954
  end;
955
  if CheckBox6.Checked
956
  then
957
  begin
958
    Inc(i);
959
    if NData > NVar then ESDY50.Text := FloatToStrF(Sqrt(wSSrTot / (NData - NVar) * Inv[i]), ffFixed, 15, PBIng50.Decimals);
960
  end;
961
  if CheckBox7.Checked
962
  then
963
  begin
964
    Inc(i);
965
    if NData > NVar then ESDY100.Text := FloatToStrF(Sqrt(wSSrTot / (NData - NVar) * Inv[i]), ffFixed, 15, PBIng100.Decimals);
966
  end;
967
  if CheckBox8.Checked
968
  then
969
  begin
970
    Inc(i);
971
    if NData > NVar then ESDMeanPD.Text := FloatToStrF(Sqrt(wSSrTot / (NData - NVar) * Inv[i]), ffFixed, 15, PBMeanPD.Decimals);
972
  end;
973
  if CheckBox9.Checked
974
  then
975
  begin
976
    Inc(i);
977
    if NData > NVar then ESDPrecocity.Text := FloatToStrF(Sqrt(wSSrTot / (NData - NVar) * Inv[i]), ffFixed, 15, PBPrecocity.Decimals);
978
  end;
979
  if CheckBox10.Checked
980
  then
981
  begin
982
    Inc(i);
983
    if NData > NVar then ESDMaintenance.Text := FloatToStrF(Sqrt(wSSrTot / (NData - NVar) * Inv[i]), ffFixed, 15, PBMaintenance.Decimals);
984
  end;
985
  // Erreurs
986
  LInfo.Visible := True;
987
  case MathErr of
988
    OptNonConv: LInfo.Caption := _('Non-convergence');
989
    OptSing: LInfo.Caption := _('Singular Hessian matrix');
990
    OptBigLambda: LInfo.Caption := _('Marquardt parameter too high');
991
    else LInfo.Visible := False;
992
  end;
993
  if CBAALimit.Checked and PDLimit
994
  then
995
    MessageDlg(MsgPDLimit, mtWarning, [mbOK], 0);
996
  BBOk.Enabled := ProfilPValid(PProfilTempo);
997
end;
998
999
procedure TFCalibrProfilP.PBPVInitChange(Sender: TObject);
1000
begin
1001
  if not MiseAJour
1002
  then
1003
  begin
1004
    PProfilTempo.PVInit := PBPVInit.AsFloat;
1005
    // Recalculer les poids initiaux de prot?ines et lipides
1006
    PProfilTempo.ProtInit := CalcProt(PProfilTempo.PVInit);
1007
    PProfilTempo.LipInit := CalcLipProt(PProfilTempo.PVInit, PProfilTempo.ProtInit);
1008
    if ProfilPValid(PProfilTempo)
1009
    then // Affichage de la simulation
1010
    begin
1011
      CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
1012
      CBGraphLeftChange(nil);
1013
      CBGraphRightChange(nil);
1014
    end;
1015
  end;
1016
end;
1017
1018
procedure TFCalibrProfilP.PBIng50Change(Sender: TObject);
1019
begin
1020
  if not MiseAJour
1021
  then
1022
  begin
1023
    with PProfilTempo^ do
1024
      CalcCoef(Equation, Unite, PBIng50.AsFloat, PBIng100.AsFloat, a, b);
1025
    if ProfilPValid(PProfilTempo)
1026
    then // Affichage de la simulation
1027
    begin
1028
      CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
1029
      CBGraphLeftChange(nil);
1030
      CBGraphRightChange(nil);
1031
    end;
1032
  end;
1033
end;
1034
1035
procedure TFCalibrProfilP.PBIng100Change(Sender: TObject);
1036
begin
1037
  if not MiseAJour
1038
  then
1039
  begin
1040
    with PProfilTempo^ do
1041
      CalcCoef(Equation, Unite, PBIng50.AsFloat, PBIng100.AsFloat, a, b);
1042
    if ProfilPValid(PProfilTempo)
1043
    then // Affichage de la simulation
1044
    begin
1045
      CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
1046
      CBGraphLeftChange(nil);
1047
      CBGraphRightChange(nil);
1048
    end;
1049
  end;
1050
end;
1051
1052
procedure TFCalibrProfilP.PBMeanPDChange(Sender: TObject);
1053
begin
1054
  if not MiseAJour
1055
  then
1056
  begin
1057
    PProfilTempo.PDMoy := PBMeanPD.AsFloat;
1058
    if ProfilPValid(PProfilTempo)
1059
    then // Affichage de la simulation
1060
    begin
1061
      CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
1062
      CBGraphLeftChange(nil);
1063
      CBGraphRightChange(nil);
1064
    end;
1065
  end;
1066
end;
1067
1068
procedure TFCalibrProfilP.PBPrecocityChange(Sender: TObject);
1069
begin
1070
  if not MiseAJour
1071
  then
1072
  begin
1073
    PProfilTempo.BGompertz := PBPrecocity.AsFloat;
1074
    if ProfilPValid(PProfilTempo)
1075
    then // Affichage de la simulation
1076
    begin
1077
      CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
1078
      CBGraphLeftChange(nil);
1079
      CBGraphRightChange(nil);
1080
    end;
1081
  end;
1082
end;
1083
1084
procedure TFCalibrProfilP.PBMaintenanceChange(Sender: TObject);
1085
begin
1086
  if not MiseAJour
1087
  then
1088
  begin
1089
    PProfilTempo.Entretien := PBMaintenance.AsFloat;
1090
    if ProfilPValid(PProfilTempo)
1091
    then // Affichage de la simulation
1092
    begin
1093
      CalcSimulP(-1, PProfilTempo.Num, PProfilTempo.SeqAli, PProfilTempo.Ration, -1, 1, PResSimulTempo, CBAALimit.Checked);
1094
      CBGraphLeftChange(nil);
1095
      CBGraphRightChange(nil);
1096
    end;
1097
  end;
1098
end;
1099
1100
procedure TFCalibrProfilP.PBwFeedChange(Sender: TObject);
1101
begin
1102
  w[1] := PBwFeed.AsFloat;
1103
  EwFeed.Text := PBwFeed.Text;
1104
end;
1105
1106
procedure TFCalibrProfilP.PBwWeightChange(Sender: TObject);
1107
begin
1108
  w[2] := PBwWeight.AsFloat;
1109
  EwWeight.Text := PBwWeight.Text;
1110
end;
1111
1112
procedure TFCalibrProfilP.PBwBackfatChange(Sender: TObject);
1113
begin
1114
  w[3] := PBwBackfat.AsFloat;
1115
  EwBackfat.Text := PBwBackfat.Text;
1116
end;
1117
1118
procedure TFCalibrProfilP.PBwLeanChange(Sender: TObject);
1119
begin
1120
  w[4] := PBwLean.AsFloat;
1121
  EwLean.Text := PBwLean.Text;
1122
end;
1123
1124
procedure TFCalibrProfilP.RBExpertClick(Sender: TObject);
1125
begin
1126
  CBMethod.Enabled := True;
1127
  CBAALimit.Enabled := True;
1128
  PBwFeed.Visible := True;
1129
  PBwWeight.Visible := True;
1130
  PBwBackfat.Visible := True;
1131
  PBwLean.Visible := True;
1132
  EwBackfat.Enabled := True;
1133
  EwLean.Enabled := True;
1134
  ERSDBackfat.Enabled := True;
1135
  ERSDLean.Enabled := True;
1136
  ER2Backfat.Enabled := True;
1137
  ER2Lean.Enabled := True;
1138
  EwRSSBackfat.Enabled := True;
1139
  EwRSSLean.Enabled := True;
1140
  EMaintenanceInitial.Enabled := True;
1141
  EMaintenanceFinal.Enabled := True;
1142
  ESDMaintenance.Enabled := True;
1143
  CheckBox1.Visible := True;
1144
  CheckBox2.Visible := True;
1145
  CheckBox3.Visible := True;
1146
  CheckBox4.Visible := True;
1147
  CheckBox5.Visible := True;
1148
  CheckBox6.Visible := True;
1149
  CheckBox7.Visible := True;
1150
  CheckBox8.Visible := True;
1151
  CheckBox9.Visible := True;
1152
  CheckBox10.Visible := True;
1153
end;
1154
1155
procedure TFCalibrProfilP.RBStandardClick(Sender: TObject);
1156
begin
1157
  CBMethod.Enabled := False;
1158
  CBAALimit.Enabled := False;
1159
  PBwFeed.Visible := False;
1160
  PBwWeight.Visible := False;
1161
  PBwBackfat.Visible := False;
1162
  PBwLean.Visible := False;
1163
  ERSDBackfat.Enabled := False;
1164
  ERSDLean.Enabled := False;
1165
  ER2Backfat.Enabled := False;
1166
  ER2Lean.Enabled := False;
1167
  EwRSSBackfat.Enabled := False;
1168
  EwRSSLean.Enabled := False;
1169
  EMaintenanceInitial.Enabled := False;
1170
  EMaintenanceFinal.Enabled := False;
1171
  ESDMaintenance.Enabled := False;
1172
  CheckBox1.Visible := False;
1173
  CheckBox2.Visible := False;
1174
  CheckBox3.Visible := False;
1175
  CheckBox4.Visible := False;
1176
  CheckBox5.Visible := False;
1177
  CheckBox6.Visible := False;
1178
  CheckBox7.Visible := False;
1179
  CheckBox8.Visible := False;
1180
  CheckBox9.Visible := False;
1181
  CheckBox10.Visible := False;
1182
end;
1183
1184
procedure TFCalibrProfilP.Uncheck;
1185
begin
1186
  CheckBox1.Checked := False; // Feed
1187
  CheckBox2.Checked := False; // Weight
1188
  CheckBox3.Checked := False; // Backfat
1189
  CheckBox4.Checked := False; // Lean
1190
  CheckBox5.Checked := False; // InitBW
1191
  CheckBox6.Checked := False; // Y50
1192
  CheckBox7.Checked := False; // Y100
1193
  CheckBox8.Checked := False; // PDMean
1194
  CheckBox9.Checked := False; // Precocity
1195
  CheckBox10.Checked := False; // Maintenance
1196
end;
1197
1198
end.