J'ai un ensemble de spécifications qu'un produit en production devrait respecter. J'ai une colonne avec une formule qui spécifie les valeurs nécessaires (limites) par chaque spécification et crée un succès/échec binaire. Cette formule est utilisée pour créer un graphique de Pareto du nombre et du pourcentage de réussite. Je souhaite créer un graphique de Pareto interactif avec des curseurs pour ajuster les limites de test et voir comment la modification de ces limites modifierait le nombre d'éléments réussissant/échouant au test.
Mes deux principaux problèmes sont les suivants :
1) Plusieurs types de produits seront testés. Je n'aurai pas un nombre constant de spécifications par produit, donc je prévois d'insérer ces spécifications dans une liste (dans le code joint, ce serait "spec") et d'utiliser une table de données externe pour remplir ces spécifications pour le produit souhaité. Ce n'est pas quelque chose pour lequel j'ai besoin d'aide, mais c'est quelque chose à considérer car je devrai saisir des curseurs, des nombres, etc. dans une boucle for sans faire directement référence aux variables.
2) J'ai besoin d'un tableau de variables (limites de spécification) pour pouvoir mettre à jour la formule à des fins de test. Encore une fois, cela devra être dans une boucle for. Dans l'état actuel du script, il semble que les valeurs des limites de spécification ne soient pas mises à jour dans la formule de la colonne réussite/échec. Lorsque le curseur reçoit la commande <
J'ai joint l'exemple de table de données que j'utilise ainsi que le script actuel. Merci!
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));Le code est assez fortement modifié et je ne suis pas sûr à 100% de sa fiabilité, mais j'utiliserais la fonction set et child/sib/parent pour obtenir les références correctes liées aux curseurs. Pareto semble également être mis à jour lorsque la valeur de la formule est mise à jour. Cela pourrait bénéficier d'une certaine utilisation de 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);
);
Dans votre code, il semble qu'il vous manque peut-être ^ autour des tests pour obtenir les valeurs dans le tableau associatif limit mis à jour.