[JMP 17.0.0]
제가 작업하고 있는 프로젝트 파일에는 많은 데이터 테이블이 있고 각 테이블에는 출력으로 저널을 생성하는 데 사용하는 상대적으로 오래 실행되는 스크립트가 있습니다.다른 테이블에는 각각의 개별 테이블 스크립트를 호출하는 별도의 스크립트가 있으며, 그런 다음 개별 저널을 단일 저널로 모아 최종 보고서를 만듭니다.[아마도 이 접근 방식을 훨씬 더 깔끔하게 만들 수 있었을 것입니다. 그러나 저는 전체(또는 심지어 부분) 타임코더는 아닙니다.]
나는 각 개별 테이블 스크립트 실행 후 실행 진행 상황을 추적하기 위해 일종의 "X/Y 완료" 업데이트 진행률 표시줄/메시지 상자를 구현하고 싶었습니다.
이것은 내가 어떻게 현재의 솔루션을 갖게 되었는지에 대한 이야기입니다.
TL;DR – 나 혼자만의 영리한 접근 방식을 고안하는 데 하루를 보낸 후 가장 쉬운 방법이었을 Caption()을 발견했습니다.
하지만 프로젝트 환경 내에서 창을 어떻게 조작할 수 있는지에 대한 몇 가지 일반적인 질문이 여전히 남아 있습니다. 관심이 있으시면 저에게 연락해 주세요.
토론을 검색하는 동안 다음과 같은 몇 가지 훌륭한 구현 아이디어를 발견했습니다.
https://community.jmp.com/t5/Uncharted/Progress-Bar/ba-p/21160
https://community.jmp.com/t5/Uncharted/Progress-Bar-with-Cancel-Button/ba-p/433560#U433560
https://community.jmp.com/t5/Discussions/Suggestion-on-how-to-script-a-small-update-progress-window-for/mp/250419
그러나 프로젝트 환경 내에서 이러한 솔루션을 구현하려고 하면 생성되는 새 진행률 표시줄이 항상 프로젝트에 새 탭으로 생성됩니다. 시리즈의 다음 스크립트가 시작되면 스크립트와 관련된 후속 데이터 테이블 조작으로 인해 진행률 표시줄 창이 숨겨지므로 업데이트된 진행률 메시지가 표시되지 않습니다.
일반적인 질문 #1: 모달 창이 아닌 메시지 상자로 "팝아웃" 창을 만드는 방법을 알 수 없습니다.내 이해는 사용자가 창과 상호 작용할 때까지 모달 창에서 스크립트를 일시 중지한다는 것입니다. 이는 내가 원하지 않는 것입니다.새 탭이 아닌 "팝아웃"으로 새 비모달 창을 만드는 방법에 대해 제가 놓친 부분이 있습니까?
[이제 다시 Caption()이라는 것이 있다는 것을 깨달았습니다.하지만 프로젝트의 모든 새 창을 팝업 창이 아닌 새 탭으로 열어야 하는지에 대한 일반적인 질문이 여전히 남아 있습니다.]
일반적인 질문 #2: 그렇다면 제 생각에는… 새로 생성된 진행률 표시줄 창을 프로젝트 레이아웃의 다른 위치에 도킹하여 나머지 작업과 분리할 수 있는 방법이 있을 것입니다. 예를 들어 New Window() << Dock( “ 오른쪽").그러나 나는 그런 것을 찾지 못했습니다.창의 도킹 위치를 스크립트하는 방법이 있습니까?
그런 다음 프로젝트 레이아웃의 작동 방식과 스크립트 작성 방법을 배우는 데 많은 시간을 보냈습니다.나는 그 운동을 통해 많은 것을 배웠다.결국, 프로젝트 레이아웃을 일시적으로 변경하여 "최근 파일" 창을 내가 찾고 있는 작업을 수행하는 사용자 정의 "진행 업데이트" 창으로 교체한 다음 "최근 파일" 창으로 다시 되돌리는 스크립트를 생각해냈습니다. " 창문.여러분이 상상할 수 있듯이 이는 꽤 서투른 스크립트이지만 작업은 완료됩니다.나는 그것을 최대한 일반화하려고 노력했고, 그것이 어떻게 작동하는지 보고 싶은 사람이 있을 경우를 대비해 여기에 첨부했습니다.
하루 중 어느 시점에서 나는 개별 스크립트에 의해 생성된 새 창을 보이지 않게 하여 진행률 표시줄 창이 맨 위에 유지되도록 하여 이 작업을 수행할 수 있는 방법이 있다는 것을 깨달았습니다.하지만 미리 생각했다면 더 좋았을 것입니다.이 시점에서 이 옵션을 달성하려면(가능한 경우) 수백 번의 스크립트 편집을 수행해야 합니다.
결국, 나는 오늘 아침에 이 모든 이야기를 들려주기 위해 출근했고 거의 즉시 Caption()을 발견했습니다. 이는 기본적으로 두 개의 간결한 코드 줄로 내가 하고 싶었던 모든 작업을 수행합니다.나는 그것을 더 일찍 깨달았더라면 좋았을 뿐입니다.텍스트뿐만 아니라 진정한 진행 "바"를 정말로 원한다면 Caption()이 작동하지 않을 수도 있습니다.그러나 나는 이것이 그렇게 화려할 필요는 없었습니다.
들어 주셔서 감사합니다.
조엘
제가 디스커버리 서밋에서 JMP 사용자 경험 연구소(또는 이와 유사한 곳)에 참석했을 때 처음으로 프로젝트를 사용했습니다(이전에 사용했지만 창 도용으로 인해 금방 중단했습니다). 나는 사용성 제안을 거의 하지 않았고 일부는 희망 목록 항목으로 바꿨습니다.
JMP 프로젝트에 모든 창을 포함하지 않는 옵션 추가 (이 주제와 관련됨)
JMP 프로젝트 탭/시트/리포트 선택기에 그룹화 옵션(데이터 테이블별) 추가 - JMP User Community
데이터 테이블 이후에 JMP 프로젝트에서 새 보고서를 열 수 있는 옵션을 추가합니다... - JMP 사용자 커뮤니티
JMP 프로젝트의 (비)자체 콘텐츠 관리 개선 (이것은 나중에 만들어졌습니다)
그 창 도둑질은 현재 프로젝트를 시도조차 하지 않는 주된 이유입니다.
캡션은 다행히도 프로젝트에서 사용할 수 있으며 상당히 유용한 진행 표시줄로 바꿀 수도 있습니다. Caption()을 사용하여 어떤 유형의 진행률 표시줄을 만들었는지는 잘 모르겠지만 동일한 아이디어를 캡션과 함께 사용할 수 있으므로 디스플레이 상자 대신 텍스트를 사용하는 진행률 표시줄 클래스 중 하나를 빠르게 수정했습니다.
Names Default To Here(1);
// https://www.jmp.com/support/help/en/17.2/index.shtml#page/jmp/send-information-to-a-user.shtml
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat(":black_large_square:", cur_val);
progress_left = Repeat(":white_large_square:", 10 - cur_val);
progress_text_line = Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
Caption({800, 900}, progress_text, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
update_txt;
Caption(progress_text, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
wait(0.1);
);
Caption(remove);
</CODE></P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1700199991012.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><img src="https://us.v-cdn.net/6038925/uploads/images/58845i7B2DA85C421D9547/jthi_0-1700199991012.png" role="button" title="jthi_0-1700199991012.png" alt="jthi_0-1700199991012.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P>
<P>아마도 내년에는 JMP 프로젝트를 사용하는 스크립트를 작성해야 할 때 이와 같은 것을 사용할 것입니다.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-700215" slang="en-US" mode="NONE">답변: 진행률 표시줄 - 개인적인 여정(프로젝트 환경에서 창 조작에 대한 질문도 있음)</LINGO-SUB><LINGO-BODY id="lingo-body-700215" slang="en-US" mode="NONE"><P>하하 - 제가 원래 시도한 캡션은 다음과 같이 간단했습니다.</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jc510_2_0-1700254043192.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><span class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><img src="https://us.v-cdn.net/6038925/uploads/images/58893iDA1A9DE7B3CD3C76/jc510_2_0-1700254043192.png" role="button" title="jc510_2_0-1700254043192.png" alt="jc510_2_0-1700254043192.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> - 귀하의 솔루션은 확실히 더 우아하며 귀하의 솔루션을 선호하여 이미 이전 접근 방식을 모두 포기했습니다.Jarmo 제안에 감사드립니다!</P><P>스크립트가 제대로 작동하도록 하려면 스크립트를 몇 가지 편집해야 했습니다. Caption() 매개변수의 문자열을 Progress_text에서 update_txt로 변경하고 "black/white_large_square"를 유니코드 문자로 바꿨습니다.또한 프로젝트 창에서 캡션 상자를 대략 중앙에 배치하기 위해 몇 줄을 추가했습니다.아래에 수정된 스크립트를 게시했습니다.</P><P>또한 문서 라이브러리의 "사용자에게 정보 보내기" 섹션을 알려주셔서 감사합니다.이제 StatusMsg()를 사용하여 상태 표시줄에 메시지를 보내는 방법도 있다는 것을 알았습니다.Caption()에 대한 호출을 StatusMsg()에 대한 호출로 바꾸면 팝업 창이 필요하지 않거나 제가 했던 것처럼 프로젝트 레이아웃을 조작하지 않고도 동일한 효과를 얻을 수 있습니다.아래에 해당 버전도 게시했습니다.</P><P>[편집: StatusMsg() 옵션을 좀 더 가지고 놀고 난 후, 상태 메시지로 전송되는 다른 스크립트 관련(스크립트가 아닌) 메시지 수에 따라 진행률 표시줄을 지속적으로 표시하는 것이 어려울 수 있음을 발견했습니다. 스크립트가 실행되는 동안 막대를 표시합니다.Caption() 접근 방식은 여전히 잘 작동하며 대부분의 시나리오에서 두 가지 접근 방식 중 가장 좋을 것 같습니다.]</P><P>저는 한동안 프로젝트 작업을 해왔습니다.프로젝트 작업에 꼭 필요한 것은 아니라는 것을 무의식적으로 알고 있지만 테이블/탭 구성 측면이 마음에 듭니다.프로젝트를 진행하면서 중요한 문제에 직면한 것은 이번이 처음입니다. 하지만 귀하가 제기한 다른 잠재적인 개선 사항을 살펴본 후에는 개선할 수 있는 사항이 있다는 데 동의합니다.</P><P>수정된 Caption() 스크립트:</P><PRE><CODE class=" language-jsl">Names Default To Here(1);
proj = This Project();
projWidth = proj << Get Width;
projHeight = proj << Get Height;
windowPos = proj << Get Window Position();
capPos_h = windowPos[1] + ( projWidth / 2) - 75;
capPos_v = windowPos[2] + ( projHeight / 2);
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat("\!U2B1B", cur_val);
progress_left = Repeat("\!U2B1C", 10 - cur_val);
progress_text_line = " " || Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
Caption({capPos_h, capPos_v}, update_txt, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
Caption( update_txt, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
Wait(0.1);
);
Caption(remove);
StatusMsg() 스크립트:
Names Default To Here(1);
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat("\!U2B1B", cur_val);
progress_left = Repeat("\!U2B1C", 10 - cur_val);
progress_text_line = " " || Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
StatusMsg( update_txt);
Wait(0.1);
);
StatusMsg( "Done! " || progress_done || progress_left || progress_text_line);
Wait(2);
StatusMsg( " ");-조엘