/*dt = Open( "$SAMPLE_STIPS/Oblea apilada pequeña.jmp" ); dt << Generador de gráficos( Tamaño( 534, 464 ), Mostrar panel de control( 0 ), Espaciado de gráficos( 4 ), Variables( X( :X_Die ), Y( :Y_Die ), Ajuste ( :Lote, Niveles por fila( 3 ) ), Color( :Defectos, Resumen de estadísticas( "Suma") ) ), Elementos( Mapa de calor( X, Y, Leyenda( 5 ) ) ), SendToReport( Despacho( {}, "X_Die", ScaleBox, {Min( - 22), Max (22), Inc (5), Ticks menores (4)}), Despacho ({}, "Y_Die", ScaleBox, {Min (-20), Max (22), Inc (5), Menor Ticks( 4 )} ), ) );*/ // segunda parte ---------------------------------- ---------------------- //Nombres predeterminados aquí( 1 ); Nuevo espacio de nombres ("LineScan"); LineScan:LS_Initialize = Function( {}, // variables utilizadas para la comunicación entre Linescan y 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() = Función( {}, dtList = Obtener lista de tabla de datos(); Para cada uno( {checkDt, idx}, dtList, If( Not(IsMissing(Regex( checkDt << get name(), "tempDTLineCutXY. *" ))) , Imprimir( checkDt << obtener nombre() || ": cerrar" ); Cerrar(checkDt, no guardar) ) ); ); LineScan:LS_findVariables = Function( {}, foundX = 0; foundY = 0; foundCol = 0; allVariables = (LineScan:gb << obtener variables); For Each( {var, idx}, allVariables, If( Arg( var[ 2] ) == "X", xVar = var[1]; encontradoX = 1; ); If( Arg( var[2] ) == "Y", yVar = var[1]; encontradoY = 1; ); If( Arg( var[2] ) == "Color", colVar = var[1]; foundCol = 1; ); ); LineScan:myStatistics = "Mean"; LineScan:myGroups = {}; gbScript = LineScan:gb << Obtener script; numArgs = N Arg( gbScript ); For( i = 1, i <= numArgs, i++, If( Nombre del encabezado( Arg( gbScript, i ) ) == "Variables", //Imprimir( "encontrado variables", i ); nVariables = N Arg( Arg( gbScript, i ) ); For( k = 1, k <= nVariables, k++, If( Nombre principal( Arg( Arg( gbScript, i ), k ) ) = = "Color", //Imprimir( "color encontrado", k ); nEntries = N Arg( Arg( gbScript, i ) ); For( m = 1, m <= nEntries, m++, If( Nombre del encabezado( Arg( Arg( Arg( gbScript, i ), k ), m ) ) == "Estadística resumida", //Imprimir( "estadística encontrada", m ); LineScan:misEstadísticas = Arg( Arg( Arg( Arg( gbScript, i ) , k ), m ), 1 ) ) );, miCabeza = Nombre de la cabeza( Arg( Arg( gbScript, i ), k ) ); Contiene ({"Grupo X", "Grupo Y", "Envoltura"}, myHead);, //Imprimir( "grupo encontrado", k); Insertar en( LineScan:misGrupos, Arg( Arg( Arg( gbScript, i ), k ), 1 ) ) ), ); ) ); encontradoX * encontradoY * encontradoCol; ); LineScan:LS_sel_rows = Función( {}, falló = 0; xx = xVar << obtener valores(); yy = yVar << obtener valores(); nr = N elementos (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);// distancia entre puntos If( Y( dx == 0, dy == 0 ), Print( "sin línea" ); falló = 1; , px1 = (xx - x1); py1 = (yy - y1); dotp1 = (px1 * dx + py1 * dy); proj1sq = dotp1 dotp1 / d1_2sq; // proyección a lo largo de la línea proj1=sqrt(proj1sq); lensq = px1 px1 + py1 py1; // distancia a pt1 dist = Sqrt( lensq - proj1sq ); / /Selección de Pitágoras = J( nr, 1 ); ancho = Si( Está vacío( anchoEB ), Imprimir( "usar valor predeterminado" ); 0.7; , anchoEB << get() ); selección[Loc( dist > ancho )] = .; px2 = (xx - x2); py2 = (yy - y2); dotp2 = (px2 * dx + py2 * dy); proj2sq = dotp2 dotp2 / d1_2sq; proj2=sqrt(proj2sq); selección[Loc( proj1 > d1_2 )] = .; //eliminar puntos demasiado lejanos (radio alrededor del inicio y el final) selección[Loc( proj2 > d1_2 )] = .; filas filtradas = Loc((1::nr)`); Try( ldf = Linescan:TheReport["Filtro de datos locales"] << obtener objeto programable(); // maravilloso (gracias Jim) filteredRows = ldf << Obtener filas filtradas; ); Filas excluidas = J(nr, 1); If(!IsMissing(filteredRows), excluidos[filteredRows] = .; excluidos=Loc(excluidos); selección[excluidos] = .; //aplicar filtro de datos); selección[LineScan:dt << Obtener filas excluidas()] = .; // aplicar selección de filtro de datos global = Loc( selección ); //solo mantén los que no están vacíos If( N Items( selección ) <= 0, Print( "nada seleccionado" ); falló = 1; , posAlongLine = proj1[selección]; LineScan:CloseTemporaryTables(); LineScan:dt < < Borrar selección; LineScan:dt << Seleccionar filas (selección); LineScan:dt_tempLineCut = LineScan:dt << Subconjunto (invisible, filas (selección), solo columnas seleccionadas (0), ocultas); LineScan:dt_tempLineCut << Nueva columna ( "posición a lo largo de la línea", Numérico, "Continuo", valores( posAlongLine ) ); LineScan:dt_tempLineCut << Establecer nombre( "tempDTLineCutXY" ); ); ); No (fallido); ); LineScan:GetStatisticsFunction = Función( {myStat}, Imprimir( "implementar" ) ); LineScan:LS_prepareExpressions = Function( {myStat}, //Print( "LS: prepareExpressions" ); myStatisticsFunction = Match( myStat, "N", Nombre Expr( Número de columna), "Media", Nombre Expr( Col Media), " Modo", Nombre Expr( Col Modo), "Suma", Nombre Expr( Col Suma), "Std Dev", Nombre Expr( Col Std Dev), "Min", Nombre Expr( Col Mínimo), "Max", Nombre Expr( Col Máximo ), "Mediana", Nombre Expr( Col Mediana ), "Rango", Nombre Expr( Col Rango ), "Suma acumulativa", Nombre Expr( Col Suma acumulativa), Nombre Expr( Número de columna ) ); LineScan :YvariableName = myStat || "(" || (colVar << Obtener nombre) || ")"; LineScan:preparedYFunction = Substitute( Expr( __aggregation__( __colVar__, __xVar__, __yVar__ ) ), Expr( __aggregation__ ), Nombre Expr( myStatisticsFunction), Expr( __colVar__), Nombre Expr( colVar), Expr( __xVar__), Nombre Expr( xVar), Expr( __yVar__), Nombre Expr( yVar), ); If( myStat == "Mediana", LineScan:preparedYFunction = Insertar( Nombre Expr( LineScan:preparedYFunction ), 0.5, 2 ) ); Para cada uno( {GroupVar, idx}, LineScan:misGrupos, LineScan:preparadoYFunction = Insertar( Nombre Expr( LineScan:preparadoYFunction ), Nombre Expr( GroupVar ) ) ); LineScan:preparedVariables = Expr( Variables( X( :posición a lo largo de la línea ), Y( :YVariable ) ) ); If( N Elementos( LineScan:misGrupos ), LineScan:Variables preparadas = Insertar( Nombre Expr( LineScan:preparadasVariables ), Eval Expr( Superposición( Expr( LineScan:misGrupos[1] ) ) ) ) ); 1 //valor de retorno, ¡¡¡no eliminar !!! ; ); LineScan:LS_prepareWindow = Función( {}, //Imprimir( "LS: prepareWindow" ); Si( Está vacío( LineScan:LinecutWindow ), LineScan:LinecutWindow = Nueva ventana( "Linecut", Mostrar menú( 0 ), Mostrar barras de herramientas( 0 ), Cuadro de lista V( Cuadro de lista H( Cuadro de texto( "ancho del corte de línea: " ), anchoEB = Cuadro de edición de número( 0.6 ), Cuadro de texto( " ¿actualizar? -> dibujar una nueva línea" ) ), Spacer Box( tamaño( 100, 0 ) ), H List Box( Spacer Box( tamaño( 0, 100 ) ), gb2_container = V List Box() ) ), ); LineScan: LinecutWindow << en Cerrar( // no funciona ?!??! Imprimir("cerrando ventana"); LineScan:CerrarTablasTemporales(); ) ; , LineScan:LineCutWindow << Traer ventana al frente ) ); LineScan:LS_generateNewPlot = Function( {}, //Imprimir( "generatePlot" ); Try( gbLC << eliminar() ); gb2_container << Append( Eval( Substitute( Expr( gbLC = LineScan:dt_tempLineCut << Generador de gráficos( Transformar Columna( "YVariable", Fórmula( __estadísticas__ ) ), Tamaño( 450, 250 ), Mostrar panel de control( 0 ), Mostrar leyenda( 0 ), Mostrar título( 0 ), Ajustar ventana(), Espaciado de gráfico( 4 ), __variables__ , Elementos( Puntos( X, Y, Leyenda( 3 ) ), Suavizado( X, Y, Leyenda( 4 ), Lambda( 0.005 ) ) ) ) ), Expr( __estadísticas__ ), Nombre Expr( LineScan:preparedYFunction ), Expr( __variables__ ), Nombre Expr( LineScan:preparedVariables ) ) ) ); If( N Elementos( LineScan:myGroups ), gbLC << Mostrar leyenda( 1 ) ); Informe( gbLC )[AxisBox( 1 )] << Min( 0 ) ; Informe( gbLC )[Cuadro de edición de texto( 4 )] << Establecer texto( LineScan:YvariableName ); Informe( gbLC )[Cuadro de esquema( 1 )] << Establecer título( "Linecut" ); ); LineScan:LS_update = Función( {}, {Local predeterminado}, //Imprimir( "LS: actualizar" ); 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 << Borrar selección; LineScan:startx = x; LineScan:starty = y; LineScan:MyfirstClick++; ); LineScan:exx = x; Escaneo de línea:exy = y; ); // ahora agreguemos MouseTrap LineScan:LS_Initialize(); Try( LineScan:CloseTemporaryTables(); Linescan:TheReport = Informe actual(); gbrs = (Informe actual() << XPath( "//OutlineBox[
@helpKey = 'Creador de gráficos']" )); If( N elementos( gbrs ), Linescan:gb = gbrs[1] << Obtener objeto programable(); Linescan:dt = Linescan:gb << Obtener tabla de datos(); FrameBoxes = gbrs[1] << XPath( "//FrameBox" ) ; Para cada uno( {myFrameBox, idx}, FrameBoxes, myFrameBox << agregar script de gráficos( 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; ) ); ); );