Ich habe eine Reihe von Spezifikationen, die ein Produkt in der Produktion erfüllen muss. Ich habe eine Spalte mit einer Formel, die die erforderlichen Werte (Limits) für jede Spezifikation angibt und ein binäres Pass/Fail erstellt. Diese Formel wird verwendet, um ein Pareto-Diagramm der Durchgangszahl und des Prozentsatzes zu erstellen. Ich möchte ein interaktives Pareto-Diagramm mit Schiebereglern erstellen, um die Testgrenzen anzupassen, und sehen, wie das Ändern dieser Grenzen die Anzahl der Elemente ändern würde, die den Test bestehen/nicht bestehen.
Meine zwei Hauptprobleme sind folgende:
1) Es gibt mehrere Produkttypen, die getestet werden. Ich werde keine konsistente Anzahl von Spezifikationen pro Produkt haben, also plane ich, diese Spezifikationen in eine Liste einzufügen (im angehängten Code wäre das "Spezifikation") und eine externe Datentabelle zu verwenden, um diese Spezifikationen für das gewünschte Produkt auszufüllen. Dazu brauche ich keine Hilfe, aber es ist etwas zu beachten, da ich Schieberegler, Zahlenfelder usw. in eine for-Schleife eingeben muss, ohne direkt auf die Variablen zu verweisen.
2) Ich brauche ein Array von Variablen (Spezifikationsgrenzen), damit ich die Formel zu Testzwecken aktualisieren kann. Auch dies muss in einer for-Schleife stehen. So wie das Skript gerade steht, scheinen die Werte der Spezifikationsgrenzen in der Formel für die Pass/Fail-Spalte nicht aktualisiert zu werden. Wenn das Schiebereglerfeld den Befehl << inval empfängt und das Diagramm aktualisiert wird, passiert nichts, da die tatsächliche Pass/Fail-Spalte nicht aktualisiert wird. Ich verwende derzeit ein assoziatives Array, um die Spezifikationsgrenzen zu speichern. Dies ist möglicherweise nicht der richtige Weg, dies zu tun.
Ich habe die von mir verwendete Beispieldatentabelle sowie das aktuelle Skript angehängt. Vielen Dank!
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));Der Code ist ziemlich stark modifiziert und ich bin mir nicht 100% sicher, wie zuverlässig dies sein wird, aber ich würde set function und child/sib/parent verwenden, um korrekte Referenzen in Bezug auf die Schiebereglerfelder zu erhalten. Auch Pareto scheint aktualisiert zu werden, wenn der Formelwert aktualisiert wird. Dies könnte von einer gewissen Verwendung von Eval(EvalExpr()) profitieren.
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);
);
In Ihrem Code scheint es, als ob Sie ^ beim Testen fehlen könnten, um Werte im assoziativen Array mit Grenzwerten zu aktualisieren.