JSL : 분석이 임시 데이터에 의존하는 경우 분석이 종료되면 데이터를 닫습니다 ...안녕하세요,
배경 : 현재 Graph Builder에 공급되는 일부 데이터 포인트를 보유하기 위해 임시 데이터 테이블을 생성해야하는 애드 인을 작성 중입니다. 사용자가 Graph Builder를 닫으면 임시 데이터가 사라지기를 원합니다. 그래프 빌더 호출을 변수에 저장하면 << On Close ()를 추가하여 임시 데이터도 닫을 수 있습니다.
그러나 사용자가 두 개의 다른 입력에 대해 추가 기능을 두 번 실행하여 두 개의 임시 데이터 테이블과 두 개의 그래프 빌더를 생성하려는 경우 이상한 일이 발생합니다. 이제이 경우 그래프 빌더 중 하나를 닫으면 잘못된 임시 테이블이 닫힐 수 있습니다 (다른 그래프 빌더를 함께 가져옴).
이것에 대한 간단한 해결책이 있어야한다고 생각합니다. 솔루션은 네임 스페이스와 함께 있어야한다고 생각하지만 모든 것을 함께 연결하는 방법을 알 수 없습니다! 새 네임 스페이스를 만들 때마다 "ns"를 덮어 쓰는 것 같습니다. 내가 가진 수수께끼는 자체 "ns"값을 사용하여 추가 기능의 각 개별 인스턴스를 유지하는 방법을 파악하고 올바른 "ns"값을 여러 "On Close"값 각각에 공급할 수있는 방법을 찾는 것입니다. "코드가 생성됩니다.
여기 내가하려는 작업의 단순화 된 버전이 있습니다. 이 작업을 실행 한 다음 "Make Another One"버튼을 한 번 이상 클릭 한 다음 Graph Builder 중 하나를 닫으면 다른 하나는 그대로 유지됩니다. 빌더 먼저 해고하기로 결정했습니다.
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table("Test Table",
<< New Column("Random X", << Formula(Random Normal())),
<< New Column("Random Y", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window("Test Output",
Button Box("Make Another One",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();
지혜 찾기 : 다음에 무엇을 시도해야합니까?
스크립팅Re : JSL : 분석이 임시 데이터에 의존하는 경우 분석이 종료되면 데이터를 닫습니다 ...문제는 변수 "ns"가 함수의 두 번째 및 후속 실행에서 대체된다는 것입니다.따라서 데이터 테이블에 대한 고유 한 참조를 사용해야합니다.아래는 데이터 테이블의 이름을 사용하여 닫는 코드 버전입니다.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>
Re : JSL : 분석이 임시 데이터에 의존하는 경우 분석이 종료되면 데이터를 닫습니다 ...감사. 이것은 이와 같은 간단한 솔루션에 유용합니다.
엄청난 코드 재 작성을해야할지 모르지만, 내가하고 싶은 일을 할 수 있을지 확신이 서지 않습니다. 내 실제 추가 기능은 많은 DisplayBox 참조를 ns에 저장하고 DisplayBoxes는 플랫폼과 데이터 테이블 모두에서 다양한 추가 작업을 트리거합니다. 추가 기능이 다시 시작될 때 모든 DisplayBox 참조가 잠식됩니다. 운이 좋으면 대부분의 DisplayBox를 트리거 함수로 변환하여이 << Parent를 누르고 다른 상자로 드릴 다운하여 출력 등을 업데이트 할 수 있다고 가정합니다. 내가하는 일을 진지하게 재고해야 할 것 같네요.
Names Default to Here가 코드가 다시 실행될 때마다 별도의 Here 네임 스페이스를 생성하기를 바랐지만 그렇지 않은 것 같습니다.
이 다른 길을 시작하기 전에 다른 좋은 옵션이 있습니까?
Re : JSL : 분석이 임시 데이터에 의존하는 경우 분석이 종료되면 데이터를 닫습니다 ...저는 때때로 "Names Default to Here ()"가 코드를 호출 할 때마다 별도의 네임 스페이스를 가지지 않는다는 점에 실망합니다.하지만 코드를 디버깅 할 때도 그 사실을 활용합니다.그래서 두 가지 장점이 있습니다.그러나 여기에 별도의 "Here"이름 공간을 만드는 벽이없는 아이디어가 있습니다.
원본 JSL을 가져 와서 //! 첫 번째 줄로 해당 코드는 하드 드라이브에서 열 때 자동으로 실행됩니다.해당 스크립트가 열리면 고유 한 "여기"이름 공간이 있습니다.파일을 두 번 열면 고유 한 "Here"네임 스페이스가 있습니다.
과거에 몇 번이나 사용했는데 ???? 기능 ????.내 주 프로그램은 Save Text File ()을 사용하여 문제의 JSL을 $ TEMP 위치에 저장 한 다음 후속 코드가 저장된 JSL에서 코드를 실행해야 할 때마다 Open ()을 사용하여 파일을 실행합니다.저장된 JSL과의 값 전달은 기본 프로그램과 저장된 JSL 프로그램에 정의 된 네임 스페이스를 통해 수행됩니다.
다음은 이러한 방식의 원래 예제 코드 설정이며, 실행시 각 인스턴스는 실행에서 독립적입니다.
names default to here(1);
graphJSL = "//!
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table(\!"Test Table\!",
<< New Column(\!"Random X\!", << Formula(Random Normal())),
<< New Column(\!"Random Y\!", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window(\!"Test Output\!",
Button Box(\!"Make Another One\!",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();";
Save Text File( "$TEMP/Graph1.jsl", graphJSL );
open("$TEMP/Graph1.jsl");
open("$TEMP/Graph1.jsl");