Ho una serie di specifiche che un prodotto in produzione dovrebbe superare. Ho una colonna con una formula che specifica i valori necessari (Limiti) in base a ciascuna specifica e crea un pass/fail binario. Questa formula viene utilizzata per creare un grafico di Pareto del numero e della percentuale di passaggio. Voglio creare un grafico di Pareto interattivo con caselle di scorrimento per regolare i limiti del test e vedere come la modifica di questi limiti cambierebbe la quantità di elementi che superano/non superano il test.
I miei due problemi principali sono i seguenti:
1) Ci sono più tipi di prodotti che verranno testati. Non avrò un numero coerente di specifiche per prodotto, quindi ho intenzione di inserire queste specifiche in un elenco (nel codice allegato che sarebbe "spec") e di utilizzare una tabella dati esterna per compilare quelle specifiche per il prodotto desiderato. Questo non è qualcosa per cui ho bisogno di aiuto, ma è qualcosa da considerare poiché dovrò inserire caselle di scorrimento, caselle numeriche e così via in un ciclo for senza fare riferimento direttamente alle variabili.
2) Ho bisogno di una matrice di variabili (limiti delle specifiche) in modo da poter aggiornare la formula a scopo di test. Ancora una volta questo dovrà essere in un ciclo for. Allo stato attuale dello script, sembra che i valori dei limiti delle specifiche non stiano aggiornando nella formula per la colonna pass/fail. Quando la casella di scorrimento riceve il comando << inval e il grafico si aggiorna, non accade nulla poiché la colonna pass/fail effettiva non viene aggiornata. Attualmente sto utilizzando un array associativo per memorizzare i limiti delle specifiche. Questo potrebbe non essere il modo corretto per farlo.
Ho allegato la tabella di dati di esempio che sto utilizzando e lo script corrente. Grazie!
Names default to here(1);
RangeMin = Associative array(["m1" => 0,
"m2" => 0,
"m3" => 0,
"thickness" => 0]);
RangeMax = Associative array(["m1" => 1,
"m2" =>1,
"m3" => 1,
"thickness" => 20]);
limit = Associative array(["m1" => 0.5,
"m2" => 0.5,
"m3" => 0,
"thickness" => 4]);
SliderVars = {0.5,0.5,0.5,10};
spec = {"m1","m2","m3","thickness"};
GraphingTable = current data table();
finalDisplay = New Window ("test", testlist = h list box());
:name("Pass/Fail") << Set Formula(
if((:thickness >= limit["thickness"] & :m3 >= limit["m3"] & m2 >= limit["m2"] & m1 >= limit["m1"]), "Pass", "Fail" )
);
PP= Graphing Table << Pareto Plot( Cause( :"Pass/Fail"n ) );
ValuesOutlineBox = Outline Box ( "Values", SliderList = v list box());
For(i=1, i<= n items(spec),i++,
SliderList << append(
h list box(
Text box(spec[i]),
testing = spec[i];
eval(
parse(
eval insert(
"Var^char(i)^ = ^SliderVars[i]^;
SB^char(i)^ = Slider Box(
^RangeMin << get value(spec[i])^,
^RangeMax << get value(spec[i])^,
Var^char(i)^,
NEB^char(i)^ << set( Var^char(i)^ );
limit[testing] = Var^char(i)^;
testlist[2] << Delete Box();
wait(0.1);
testlist << append(report(PP));
);"
);
);
),
testing = spec[i];
eval(
parse(
eval insert(
"NEB^char(i)^ = Number Edit Box( Var^char(i)^,
<< set function(
Function( {this},
Var^char(i)^ = this << get;
SB^char(i)^ << inval;
limit[testing] = Var^char(i)^;
testlist[2] << Delete Box();
wait(0.1);
testlist << append(report(PP));
)
)
);"
);
);
),
)
)
);
testlist << append(ValuesOutlineBox);
testlist << append(report(PP));Il codice è stato modificato in modo abbastanza pesante e non sono sicuro al 100% di quanto sarà affidabile, ma userei la funzione set e child/sib/parent per ottenere i riferimenti corretti relativi alle caselle di scorrimento. Anche pareto sembra aggiornarsi quando si aggiorna il valore della formula. Ciò potrebbe trarre vantaggio dall'utilizzo di Eval(EvalExpr())
Names Default To Here(1);
specs = Associative Array();
specs["m1"] = {0, 0.5, 1};
specs["m2"] = {0, 0.5, 1};
specs["m3"] = {0, 0, 1};
specs["thickness"] = {0, 4, 20};
GraphingTable = Current Data Table();
Column(GraphingTable, "Pass/Fail") << Set Formula(
If((:thickness >= specs["thickness"][2] & :m3 >= specs["m3"][2] & m2 >= specs["m2"][2] & m1 >= specs["m1"][2]),
"Pass",
"Fail"
)
);
nw = New Window("test", testlist = H List Box(
ValuesOutlineBox = Outline Box("Values", SliderList = V List Box()),
Graphing Table << Pareto Plot(Cause(:"Pass/Fail"n))
));
filler = {};
For Each({{spec_name, spec_list, idx}}, specs,
new_control = H List Box(
Text Box(spec_name),
Slider Box(spec_list[1], spec_list[3], 0, << Set Function(function({this},
(this << Sib) << Set(this << get, run Script(1));
))),
Number Edit Box(spec_list[2], << Set Minimum(spec_list[1]), << Set Maximum(spec_list[3]), << Set Function(function({this},
(this << Prev Sib) << Set(this << get);
specs[((this << parent) << child) << get text][2] = this << get;
Column(GraphingTable, "Pass/Fail") << Eval Formula;
)));
);
SliderList << Append(new_control);
);
Nel tuo codice sembra che potresti perdere ^ in giro per il test per ottenere i valori nell'array associativo limite aggiornato.