Tengo un conjunto de especificaciones que un producto en producción debería aprobar. Tengo una columna con una fórmula que especifica los valores necesarios (Límites) por cada especificación y crea un aprobado/fallo binario. Esta fórmula se utiliza para crear un gráfico de Pareto de número y porcentaje de paso. Quiero crear un gráfico de Pareto interactivo con cuadros deslizantes para ajustar los límites de la prueba, y ver cómo cambiar estos límites cambiaría la cantidad de elementos que aprueban/desaprueban la prueba.
Mis dos problemas principales son los siguientes:
1) Hay varios tipos de productos que se probarán. No tendré una cantidad constante de especificaciones por producto, por lo que planeo insertar estas especificaciones en una lista (en el código adjunto que sería "especificación") y usar una tabla de datos externa para completar esas especificaciones para el producto deseado. Esto no es algo con lo que necesite ayuda, pero es algo a tener en cuenta, ya que tendré que ingresar cuadros deslizantes, cuadros numéricos, etc. en un bucle for sin hacer referencia directa a las variables.
2) Necesito una matriz de variables (límites de especificación) para poder actualizar la fórmula con fines de prueba. De nuevo, esto tendrá que estar en un bucle for. Tal como está la secuencia de comandos en este momento, parece que los valores de los límites de especificación no se actualizan en la fórmula para la columna de aprobación/rechazo. Cuando el cuadro deslizante recibe el comando << inval y el gráfico se actualiza, no sucede nada ya que la columna real de aprobado/reprobado no se actualiza. Actualmente estoy usando una matriz asociativa para almacenar los límites de especificación. Esta puede no ser la forma correcta de hacerlo.
He adjuntado la tabla de datos de muestra que estoy usando, así como el script actual. ¡Gracias!
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));El código está bastante modificado y no estoy 100% seguro de qué tan confiable será, pero usaría la función set y child/sib/parent para obtener las referencias correctas relacionadas con los cuadros deslizantes. También Pareto parece actualizarse cuando se actualiza el valor de la fórmula. Esto podría beneficiarse de algún uso 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);
);
En su código, parece que podría estar perdiendo ^ en torno a las pruebas para obtener valores en la matriz asociativa límite actualizada.