/*dt = Open( "$SAMPLE_STIPS/웨이퍼 적층 Small.jmp" ); dt << 그래프 빌더( 크기( 534, 464 ), 제어판 표시( 0 ), 그래프 간격( 4 ), 변수( X( :X_Die ), Y( :Y_Die ), 줄 바꿈( :Lot, 행당 레벨( 3 )) ) ), Color( :결함, 요약 통계( "합계" ) ) ), Elements( Heatmap( X, Y, Legend( 5 ) ) ), SendToReport( Dispatch( {}, "X_Die", ScaleBox, {Min( - 22 ), Max( 22 ), Inc( 5 ), Minor Ticks( 4 )} ), Dispatch( {}, "Y_Die", ScaleBox, {Min( -20 ), Max( 22 ), Inc( 5 ), Minor Ticks( 4 )} ), ) );*/ // 두 번째 부분 ---------------------------------- ---------------------- //기본 이름은 여기에 있습니다( 1 ); 새 네임스페이스( "LineScan" ); LineScan:LS_Initialize = Function( {}, // Linescan과 Mousetrap 간의 통신에 사용되는 변수 LineScan:MyfirstClick = 1; LineScan:startx = 0; LineScan:starty = 0; LineScan:exx = 0; LineScan:exy = 0 ; LineScan:mouse_released = 0; LineScan:gb = 1; LineScan:dt = 1; ); LineScan:CloseTemporaryTables() = Function( {}, dtList = 데이터 테이블 목록 가져오기(); For Each( {checkDt, idx}, dtList, If( Not(IsMissing(Regex( checkDt << get name(), "tempDTLineCutXY. *" ))) , Print( checkDt << get name() || ": close" ); 닫기( checkDt, 저장 안함 ) ) ); ); LineScan:LS_findVariables = Function( {},foundX = 0;foundY = 0;foundCol = 0; allVariables = (LineScan:gb << 변수 가져오기); For Each({var, idx}, allVariables, If( Arg( var[ 2] ) == "X", xVar = var[1];foundX = 1; );If( Arg( var[2] ) == "Y", yVar = var[1];foundY = 1; ); If( Arg( var[2] ) == "색상", colVar = var[1];foundCol = 1; ); ); LineScan:myStatistics = "평균"; LineScan:myGroups = {}; gbScript = LineScan:gb << 스크립트 가져오기; numArgs = N Arg( gbScript ); For( i = 1, i <= numArgs, i++, If( Head Name( Arg( gbScript, i ) ) == "변수", //Print( "found 변수", i ); nVariables = N Arg( Arg( gbScript, i ) ); For( k = 1, k <= nVariables, k++, If( 헤드 이름( Arg( Arg( gbScript, i ), k ) ) = = "색상", //Print( "찾은 색상", k ); nEntries = N Arg( Arg( gbScript, i ) ); For( m = 1, m <= nEntries, m++, If( 헤드 이름( Arg( Arg( Arg( gbScript, i ), k ), m ) ) == "요약 통계", //Print( "발견된 통계", m ); LineScan:myStatistics = Arg( Arg( Arg( Arg( gbScript, i ) , k ), m ), 1 ) ) );, myHead = 헤드 이름( Arg( Arg( gbScript, i ), k ) ); Contains( {"그룹 X", "그룹 Y", "Wrap"}, myHead );, //Print( "찾은 그룹 ", k ); Insert Into( LineScan:myGroups, Arg( Arg( Arg( gbScript, i ), k ), 1 ) ) ), ); ) ); foundX *foundY *foundCol; ); LineScan:LS_sel_rows = 함수( {}, failed = 0; xx = xVar << 값 가져오기(); yy = yVar << 값 가져오기(); nr = N 항목( yy ); x1 = LineScan:startx; x2 = LineScan :exx; y1 = LineScan:starty; y2 = LineScan:exy; dx = x2 - x1; dy = y2 - y1; d1_2sq=( dx * dx + dy * dy ); d1_2= Sqrt(d1_2sq);// 사이의 거리 포인트 If( And( dx == 0, dy == 0 ), Print( "라인 없음"); failed = 1; , px1 = (xx - x1); py1 = (yy - y1); dotp1 = (px1 * dx + py1 * dy); proj1sq = dotp1 dotp1 / d1_2sq; // 선을 따라 투영 proj1=sqrt(proj1sq); lensq = px1 px1 + py1 py1; // pt1까지의 거리 dist = Sqrt( lensq - proj1sq ); / /피타고라스 선택 = J( nr, 1 ); width = If( Is 비어 있음( widthEB ), Print( "기본값 사용" ); 0.7; , widthEB << get() ); 선택[Loc( dist > width )] = .; px2 = (xx - x2); py2 = (yy - y2); dotp2 = (px2 * dx + py2 * dy); proj2sq = dotp2 dotp2 / d1_2sq; proj2=sqrt(proj2sq); 선택[Loc( proj1 > d1_2 )] = .; //너무 멀리 있는 점을 제거합니다(반경은 시작과 끝). Selection[Loc( proj2 > d1_2 )] = .; filteredRows = Loc((1::nr)`); Try( ldf = Linescan:TheReport["Local Data Filter"] << get scriptable object(); // 훌륭합니다(Jim에게 감사합니다)filteredRows = ldf << 필터링된 행 가져오기; ); 제외된 행 = J( nr, 1 ); If(!IsMissing(filteredRows), ExcludedRows[filteredRows] = .; 제외Rows=Loc(excludedRows); Selection[excludedRows] = .; //데이터 필터 적용 ); 선택[LineScan:dt << 제외된 행 가져오기()] = .; // 전역 데이터 필터 적용 Selection = Loc( Selection ); //비어 있지 않은 항목만 유지 If( N Items( Selection ) <= 0, Print( "nothing selected" ); failed = 1; , posAlongLine = proj1[selection]; LineScan:CloseTemporaryTables(); LineScan:dt < < 선택 지우기; LineScan:dt << 행 선택( 선택 ); LineScan:dt_tempLineCut = LineScan:dt << 하위 집합( 숨김, 행( 선택 ), 선택한 열만( 0 ), 숨김 ); LineScan:dt_tempLineCut << 새 열 ( "선을 따라 위치", 숫자, "연속", 값( posAlongLine ) ); LineScan:dt_tempLineCut << Set Name( "tempDTLineCutXY" ); ); ); 아님(실패); ); LineScan:GetStatisticsFunction = Function( {myStat}, Print( "구현" ) ); LineScan:LS_prepareExpressions = Function( {myStat}, //Print( "LS: prepareExpressions" ); myStatisticsFunction = Match( myStat, "N", Name Expr( Col Number ), "Mean", Name Expr( Col Mean ), " Mode", Name Expr( Col Mode ), "Sum", Name Expr( Col Sum ), "Std Dev", Name Expr( Col Std Dev ), "Min", Name Expr( Col Minim ), "Max", Name Expr( Col Maximum ), "Median", Name Expr( Col Median ), "Range", Name Expr( Col Range ), "Cumulative Sum", Name Expr( Col Cumulative Sum ), Name Expr( Col Number ) ); LineScan :YvariableName = myStat || "(" || (colVar << 이름 가져오기) || ")"; LineScan:preparedYFunction = Substitute( Expr( __aggregation__( __colVar__, __xVar__, __yVar__ ) ), Expr( __aggregation__ ), Name Expr( myStatisticsFunction ), Expr( __colVar__ ), 이름 Expr( colVar ), Expr( __xVar__ ), 이름 Expr( xVar ), Expr( __yVar__ ), 이름 Expr( yVar ), ); If( myStat == "Median", LineScan:preparedYFunction = Insert( Name Expr( LineScan:preparedYFunction ), 0.5, 2 ) ); For Each( {GroupVar, idx}, LineScan:myGroups, LineScan:preparedYFunction = Insert( Name Expr( LineScan:preparedYFunction ), Name Expr( GroupVar ) ) ); LineScan:preparedVariables = Expr( Variables( X( :선을 따른 위치 ), Y( :YVariable ) ) ); If( N Items( LineScan:myGroups ), LineScan:preparedVariables = Insert( Name Expr( LineScan:preparedVariables ), Eval Expr( Overlay( Expr( LineScan:myGroups[1] ) ) ) ); 1 //반환값, 삭제하지 마세요!!! ; ); LineScan:LS_prepareWindow = Function( {}, //Print( "LS: prepareWindow" ); If( Is 비어 있음( LineScan:LinecutWindow ), LineScan:LinecutWindow = 새 창( "Linecut", 메뉴 표시( 0 ), 도구 모음 표시( 0 ), V 목록 상자( H 목록 상자( 텍스트 상자( "라인컷 너비: " ), widthEB = 숫자 편집 상자( 0.6 ), 텍스트 상자( " 업데이트? -> 새 선 그리기" ) ), Spacer Box( size( 100, 0 ) ), H List Box( Spacer Box( size( 0, 100 ) ), gb2_container = V List Box() ) ), ); LineScan: LinecutWindow << on Close( // 작동하지 않습니다 ?!?! Print( "창 닫기" ); LineScan:CloseTemporaryTables(); ) ; , LineScan:LineCutWindow << 창을 앞으로 가져오기 ) ); LineScan:LS_generateNewPlot = Function( {}, //Print( "generatePlot" ); Try( gbLC << delete() ); gb2_container << Append( Eval( Substitute( Expr( gbLC = LineScan:dt_tempLineCut << Graph Builder( 변환 열( "YVariable", 수식( __statistics__ ) ), 크기( 450, 250 ), 제어판 표시( 0 ), 범례 표시( 0 ), 제목 표시( 0 ), 창 맞춤(), 그래프 간격( 4 ), __변수__ , Elements( Points( X, Y, Legend( 3 ) ), Smoother( X, Y, Legend( 4 ), Lambda( 0.005 ) ) ) ) ), Expr( __statistics__ ), Name Expr( LineScan:preparedYFunction ), Expr( __variables__ ), Name Expr( LineScan:preparedVariables ) ) ) ); If( N Items( LineScan:myGroups ), gbLC << 범례 표시( 1 ) ); Report( gbLC )[AxisBox( 1 )] << Min( 0 ) ; 보고서( gbLC )[텍스트 편집 상자( 4 )] << 텍스트 설정( LineScan:YvariableName ); 보고서( gbLC )[윤곽선 상자( 1 )] << 제목 설정( "Linecut" ); ); LineScan:LS_update = Function( {}, {Default Local}, //Print( "LS: 업데이트" ); If( LineScan:LS_findVariables(), If( LineScan:LS_sel_rows(), LineScan:LS_prepareExpressions( Linescan:myStatistics ); LineScan:LS_prepareWindow(); LineScan:LS_generateNewPlot(); ) ) ); LineScan:LS_getMousetrapCoordinates = Function( {}, If( LineScan:MyfirstClick == 1, LineScan:dt << 선택 지우기; LineScan:startx = x; LineScan:starty = y; LineScan:MyfirstClick++; ); LineScan:exx = x; LineScan:exy = y; ); // 이제 MouseTrap을 추가해 보겠습니다. LineScan:LS_Initialize(); Try( LineScan:CloseTemporaryTables(); Linescan:TheReport = Current Report(); gbrs = (Current Report() << XPath( "//OutlineBox[
@helpKey = 'Graph Builder']" )); If( N 항목( gbrs ), Linescan:gb = gbrs[1] << 스크립트 가능한 객체 가져오기(); Linescan:dt = Linescan:gb << 데이터 테이블 가져오기(); FrameBoxes = gbrs[1] << XPath( "//FrameBox" ) ; 각각에 대해( {myFrameBox, idx}, FrameBoxes, myFrameBox << 그래픽 스크립트 추가( Mousetrap( LineScan:LS_getMousetrapCoordinates(), LineScan:MyfirstClick = 1; LineScan:mouse_released = 1; ); myline = Line( {LineScan:startx, LineScan:starty}, {LineScan:exx, LineScan:exy} ); If( LineScan:mouse_released, If( 0, Print( 1 ), LineScan:LS_update() ) ); LineScan:mouse_released = 0; ) ); ); );