생산 중인 제품이 통과해야 하는 일련의 사양이 있습니다. 각 사양에 필요한 값(한도)을 지정하고 이진 통과/실패를 생성하는 수식이 있는 열이 있습니다. 이 공식은 통과 횟수와 백분율의 파레토 그래프를 만드는 데 사용됩니다. 테스트 제한을 조정하기 위해 슬라이더 상자가 있는 대화형 파레토 그래프를 만들고 이러한 제한을 변경하면 테스트 통과/불합격 항목의 양이 어떻게 변경되는지 확인하고 싶습니다.
내 주요 두 가지 문제는 다음과 같습니다.
1) 테스트할 여러 제품 유형이 있습니다. 제품당 사양 수가 일정하지 않으므로 이러한 사양을 목록에 삽입하고(첨부된 코드에서 "사양"이 됨) 외부 데이터 테이블을 사용하여 원하는 제품에 대한 사양을 채울 계획입니다. 이것은 내가 도움이 필요한 것은 아니지만 변수를 직접 참조하지 않고 for 루프에서 슬라이더 상자, 숫자 상자 등을 입력해야 하므로 고려해야 할 사항입니다.
2) 테스트 목적으로 공식을 업데이트할 수 있도록 변수 배열(사양 제한)이 필요합니다. 다시 이것은 for 루프에 있어야 합니다. 스크립트가 현재 상태에 있으므로 합격/불합격 열에 대한 공식에서 사양 제한 값이 업데이트되지 않는 것으로 보입니다. 슬라이더 상자가 << inval 명령을 수신하고 그래프가 새로 고쳐지면 실제 합격/불합격 열이 업데이트되지 않으므로 아무 일도 일어나지 않습니다. 현재 사양 제한을 저장하기 위해 연관 배열을 사용하고 있습니다. 이 작업을 수행하는 올바른 방법이 아닐 수 있습니다.
현재 스크립트와 함께 사용 중인 샘플 데이터 테이블을 첨부했습니다. 감사!
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));코드가 상당히 많이 수정되었고 이것이 얼마나 신뢰할 수 있을지 100% 확신할 수 없지만 슬라이더 상자와 관련된 올바른 참조를 얻기 위해 set 함수와 child/sib/parent를 사용할 것입니다. 또한 수식 값이 업데이트되면 파레토가 업데이트되는 것 같습니다. 이것은 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);
);
코드에서 업데이트된 한계 연관 배열의 값을 얻기 위해 테스트하는 동안 ^ 누락된 것 같습니다.