Grafico: calcolo e visualizzazione CPK

' Il seguente snippet deve essere inserito in un oggetto "Procedura", ed effettua il calcolo del CPK a partire da un array di misure, riportando poi i valori su un grafico.
' Devono essere passati 5 parametri
' Parameter1: oggetto "Grafico"
' Parameter2: Array monodimensionale contenente le misure
' Parameter3: Valore inferiore della misura da spacifica
' Parameter4: Valore superiore della misura da spacifica
' Parameter5: Valore del CPK calcolato e restituito dalla procedura al chiamante

Dim vmin as Double = Parameter3  ' Valore nominale
Dim vmax as Double = Parameter4  ' Tolleranza da specifica

Dim misure as DBArray=Parameter2
Dim Chart=Parameter1

' Calcola la media delle misure
dim i as integer
dim tot as double=0
dim min_mis as double=9999999
dim max_mis as double=-9999999
for i=1 to misure.size
    tot+=misure(i)	
  
  if min_mis>misure(i)
     min_mis=misure(i)
  end if
  
  if max_mis<misure(i)
     max_mis=misure(i)
  end if
next

dim mu as double=tot/misure.size ' media delle misure

' Calcola la deviazione standard
tot=0
for i=1 to misure.size
    tot+=(misure(i)-mu)^2
next

dim sigma as double=math.sqrt(tot/(misure.size-1)) ' Deviazione standard delle misure

' Trasforma le misure in istogrammi, dividendo il range di misure in segmenti e calcolando la frequenza 
dim bars as new dbarray(0,0,0,0,0,0)
dim bar_amp as double=(max_mis-min_mis)/bars.size
dim b as integer
for i=1 to misure.size
    for b=0 to bars.size-1
      if misure(i)>=min_mis+bar_amp*b and misure(i)<=min_mis+bar_amp*(b+1)
       bars(b+1)+=1
       exit for
    end if
  next
next

dim Series as new dbarray
series.Add(New DBArray("X", "Gauss", "Misure")) ' Array delle serie: il primo elemento è la testata
series.Add(New DBArray(vmin,null,0)) ' Valore minimo
series.Add(New DBArray(vmax,null,0))' Valore minimo

' Aggiunge la frequenza alla serie di misure
for b=1 to bars.size
    series.add(new dbarray(min_mis+((b-1)+0.5)*bar_amp,null,bars(b)/misure.size)) ' La X è il punto centrale, la Y è la frequenza     
next	

' Assegna i punti della gaussiana teorica
Dim x as Double

if sigma>0
   for x=mu-4*sigma to mu+4*sigma step sigma/4
       series.Add(New DBArray(x,math.exp(-(1/2) * ((x - mu)/sigma)^2)/(sigma * math.sqrt(2*math.pi)),null))
   next
end if

' Assegna le serie al grafico
Chart.SetSeries(series)

' Calcola il CPK
dim CPk as double
CPk=Min((vmax-mu)/(3*sigma),(mu-vmin)/(3*sigma))

' Assegna i settaggi del grafico
Dim s As String

s = "title:  'Media: "+ltrim(str(mu,10,5))+" Sigma: "+ltrim(str(sigma,10,5))+" CPK: "+ltrim(str(cpk,10,2)).Replace(",", ".")+"',"+
  "description: '',"+
  "enableAnimations: true," +
 "showLegend: false," +
"padding: { left: 5, top: 5, right: 5, bottom: 5 }," +
"titlePadding:  { left: 0, top: 10, right: 0, bottom: 10 }," +
"xAxis:" +
  "{" +
    "dataField: 'X'," +
    "unitInterval: 'auto'," +
    "axisSize: 'auto',"+
    "tickMarks: {" +
      "visible: true," +
      "interval: 'auto'," +
      "color:  '#BCBCBC'" +
    "}," +
    "gridLines: {" +
      "visible: true," +
      "interval: 'auto'," +
      "color: '#BCBCBC'" +
    "}," +
    "bands:"+
          "["+
          " { minValue: "+str(vmin,10,5).Replace(",", ".")+", maxValue: "+str(vmax,10,5).Replace(",", ".")+", fillColor: 'green', opacity: 0.05 },"+
          " { minValue: "+str(mu-3*sigma,10,5).Replace(",", ".")+", maxValue: "+str(mu+3*sigma,10,5).Replace(",", ".")+", fillColor: 'green', opacity: 0.1 }"+
          "]"+		
  "}," +
"valueAxis:" +
"{" +
  "visible: true," +
  "title:  { text: '' }," +
  "labels:  { visible: false }," +
  "tickMarks :  { visible: false}" +
"}," +
"colorScheme: 'scheme06'," +
"columnSeriesOverlap: false,"+
"seriesGroups:" +
  "[" +
    "{" +
      "type: 'line'," +			
      "series: [" +
          "{ dataField: 'Gauss', displayText: 'Normal',lineColor: 'red' }" +
        "]" +
    "}," +
    "{" +
      "type: 'column'," +
      "columnsGapPercent: 75,"+
      "series: [" +
          "{ dataField: 'Misure', displayText: 'misure',lineColor: 'red' }" +
        "]" +
    "}" +
  "]"
  
Chart.Settings=s

Parameter5=CPK