Re: Seleccionar 2 filas del dado fallidoTal vez algo como esto
dtt = Open( "/Z:/failures.jmp" );// 109 inner rows
expand = 2;// how far to look for a failure
// these are paired, keep them in a Nx2 matrix...
fail = (dtt:X coord << get values) || (dtt:Y coord << get values);
// get min and max of the matrix columns
failmin = V Min( fail );
failmax = V Max( fail );
// find the +/- 2 area of interest
colmin = failmin[1] - expand;
colmax = failmax[1] + expand;
rowmin = failmin[2] - expand;
rowmax = failmax[2] + expand;
// turn the failure list back into a rectangular matrix, mark the actual failures
unmarked = 0; // points that have not been marked yet
interior = 1; // the failures are interior points
border = 2; // the border points are near the failures
bigpatch = J( rowmax + 1, colmax + 1, unmarked );
For Each( {{r, c}}, across( fail[0, 2], fail[0, 1] ), bigpatch[r, c] = interior );
// helper to check near r,c
nearFailure = Function( {r0, c0}, //parameters
{rlow, rhigh, clow, chigh, r, c}, // locals
// low..high is expanded without going beyond the edge of bigpatch
rlow = Max( 1, r0 - expand );
rhigh = Min( N Rows( bigpatch ), r0 + expand );
clow = Max( 1, c0 - expand );
chigh = Min( N Cols( bigpatch ), c0 + expand );
// rlow..chigh is a slightly expanded search area
For( r = rlow, r <= rhigh, r += 1,
For( c = clow, c <= chigh, c += 1,
// any interior point (1) nearby?
If(
bigpatch[r, c] == interior// uncomment for "rounder"
// & Sqrt( (r - r0) ^ 2 + (c - c0) ^ 2 ) <= expand// the diagonal distance of the corners is expand*1.414...nearly 3...
,
Return( 1 ) // found an interior point nearby
)
)
);
/*return*/ 0; // no interior point found nearby
);
For( r = rowmin, r <= rowmax, r += 1,
For( c = colmin, c <= colmax, c += 1,
If( bigpatch[r, c] == unmarked & nearFailure( r, c ),
bigpatch[r, c] = border// add a border to the bigpatch
)
)
);
// view a cellplot
dtcp = As Table( bigpatch[rowmin - 1 :: rowmax + 1, colmin - 1 :: colmax + 1] );
dtcp[1 :: N Rows( dtcp ), 0] = dtcp[N Rows( dtcp ) :: 1, 0];// flip to make the same as graph builder
dtcp << Cell Plot( Scale Uniformly( 0 ), Center at zero( 0 ), Y( dtcp << getcolumnnames ) );
dt = Open( "/Z:/Summary Bins.jmp" );// all rows
//Clear values
dt:Highlight[1 :: N Rows( dt )] = "";
//Loop to highlight 2 dies
dt << Begin Data Update;
For( i = 1, i <= N Rows( dt ), i++,
c = dt:X coord[i];
r = dt:Y coord[i];
If( r < N Rows( bigpatch ) & c < N Cols( bigpatch ) & bigpatch[r, c] == border,
dt:Highlight[i] = "1"
);
);
dt << End Data Update;
dt << select where( :Highlight == "1" & :Bins == "1" );
dt << Graph Builder( Size( 528, 454 ), Show Control Panel( 0 ), Variables( X( :X coord ), Y( :Y coord ) ), Elements( Points( X, Y, Legend( 7 ) ) ) );
Es posible que desee esto

o esto, ver la línea comentada para el cálculo de la distancia. Depende de cómo quieras tratar la distancia diagonal.

Re: Seleccionar 2 filas del dado fallidomuchas gracias craig
Seleccione 2 filasHola comunidad JMP,
Quiero resaltar dos puntos de datos de cada una de las coordenadas X e Y del contenedor de fallas "2". Traté de escribir un código jsl, pero los resultados no son correctos.
El siguiente código resalta más de dos puntos de datos de las coordenadas X e Y del contenedor de fallas "2". ¿Alguna sugerencia?
aquí está el código
Names Default To Here( 1 );
dtt = Data Table( "failures" );
dt = Data Table( "Summary Bins" );
//Clear values
dt:Highlight[1 :: N Rows( dt )] = "";
//define list for storing +/-2 X and Y coord in the list
xList = [];
yList = [];
//get X and Y coord of the failing dies
fail_xcoord = dtt:X coord << get values;
fail_ycoord = dtt:Y coord << get values;
// Add and subtract 2 from X and Y using a loop
For( j = 1, j <= N Rows( dtt ), j++,
For( i = -2, i <= 2, i++,
newX = dtt:X coord[j] + i;
newY = dtt:Y coord[j] + i;
If( newX != dtt:X coord[j],
Insert Into( xList, newX )
);
If( newY != dtt:Y coord[j],
Insert Into( yList, newY )
);
)
);
//Loop to highlight 2 dies
dt << Begin Data Update;
For( i = 1, i <= N Rows( dt ), i++,
If( Contains( xlist, dt:X coord[i] ) & Contains( fail_ycoord, dt:Y coord[i] ),
dt:Highlight[i] = "1";
);
If( Contains( ylist, dt:Y coord[i] ) & Contains( fail_xcoord, dt:X coord[i] ),
dt:Highlight[i] = "1";
);
);
dt << End Data Update;
dt << select where( :Highlight == "1" & :Bins == "1" );
Gracias,
Jackie
Automatización y secuencias de comandosRe: Seleccionar 2 filas del dado fallido No entiendo a qué te refieres con seleccionar 2 troqueles de la región defectuosa - Quiero un borde más grueso.
Entonces, por ejemplo, si selecciono "40" en la leyenda (ver más abajo), entonces quiero agregar un borde grueso de +2 troqueles que rodeen esa región. Este mapa de oblea en particular tiene coordenadas X e Y en negativo y funciona con la función nearFailure()

Ampliado un poco:
Algo como esto. Seleccioné manualmente 2 puntos de la región seleccionada, que en este caso son puntos de datos rojos del contenedor "40". Entonces, la intención de hacer esto es aplicar una exclusión de +2 troqueles (un borde grueso) que rodea la región de la fila seleccionada.

Algo similar a lo que mencionaste, en el siguiente caso, hay un borde grueso (rojo)

Re: Seleccionar 2 filas del dado fallidoCreo que la opción 2 tendría más sentido. Le agradecería que pudiera compartir la lógica de la matriz modificada para un parche grande. No estoy exactamente seguro de cómo solucionar este problema.
Re: Seleccionar 2 filas del dado fallidoPodrías intentar algo como esto. Creo que es un mejor enfoque, pero probablemente tendrá su propio conjunto de problemas, así que pruébelo con cuidado.
// all new code, all new bugs, check carefully to see if this does what you want
dtt = Open( "/Z:/failures(2).jmp" );
dtS = Open( "/Z:/Summary Bins(2).jmp" );
// the X-Y die coordinates are expected to be integers between -9,999,996 and +9,999,996
encodeLimit = 1e7; // pack/unpack two signed 7-digit integers in one 14-digit number
// a "key" is an X-Y pair packed into a single number. It is called a key
// because it is used as a key in an associative array. These next two
// routines convert between the two representations
keysToXY = Function( {keys},
{x, y},
x = Round( keys / encodeLimit );
y = keys - x * encodeLimit;
x || y;
);
XYtoKeys = Function( {xy},
xy[0, 1] * encodeLimit + xy[0, 2]
);
// load the X-Y pairs that describe failure positions
failXY = dtt[0, {x coord, y coord}];
// elementary sanity checks
If( Any( failXY <= -encodeLimit + 4 ) | Any( failXY >= encodeLimit - 4 ),
Throw( "data range" )
);
If( Any( failXY != Floor( failXY ) ),
Throw( "integer coords" )
);
// convert X-Y failure locations to keys, verify they convert back again
failkeys = XYtoKeys( failXY );
If( !All( keysToXY( failkeys ) == failXY ),
Throw( "encode/decode 1" )
);
// template for nearby points. THIS TABLE ENCODES THE 2 PIXEL BORDER.
// you might, or might not, want the corners included; the corners are
// commented out because I like the rounded appearance better.
template = [
//-2 -2, // corner
-2 -1,
-2 0,
-2 1,
//-2 2, // corner
-1 -2,
-1 -1,
-1 0,
-1 1,
-1 2,
0 -2,
0 -1,
0 0, // center
0 1,
0 2,
1 -2,
1 -1,
1 0,
1 1,
1 2,
// 2 -2, // corner
2 -1,
2 0,
2 1
//, 2 2 // corner
];
// convert the template X-Y pairs into keys, verify they convert back again
templatekeys = XYtoKeys( template );
If( !All( keysToXY( templatekeys ) == template ),
Throw( "encode/decode 2" )
);
// somthing very cool is going to happen next: template keys will be added to a failure
// key to get a set of keys around the failure key. The template, above, represents a
// square (with rounded corners) about an origin. Adding a failure key moves the
// origin to the X-Y failure point. All the nearby locations are then inserted into a
// collection (associative array) of points that are within 2 of a failure point.
// When done, the actual failure points are removed from the collection, leaving the
// collection as the 2-wide border.
// use AssociativeArray as a set to hold the key values;
// the nearbyPoint set gets populated with both the failure
// points AND the points that are nearby as identified by the template.
nearbyPoints = Associative Array();
For Each( {failkey}, failkeys,
nearbykeys = failkey + templatekeys; // nearby is the same shape as template, but at failkey, not 0,0
nearbyPoints << Insert( Associative Array( nearbykeys ) );
);
// now remove the set of points formed from all the failures...after this,
// nearbypoints is the 2-cell boundary without the interior.
nearbyPoints << Remove( Associative Array( failkeys ) );
// now make a table for a plot. red are from the failures table, blue are the border.
border = keysToXY( Matrix( nearbypoints << getkeys ) ) || J( N Items( nearbypoints ), 1, 1 );
center = failXY || J( N Rows( failXY ), 1, 2 );
dtg = As Table( border |/ center, <<COLUMNNAMES></COLUMNNAMES>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="capture.png" style="width: 921px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><span class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><img src="https://us.v-cdn.net/6038925/uploads/images/61399i00F1D5DEBF613925/capture.png" role="button" title="capture.png" alt="capture.png" /></span></SPAN></SPAN></SPAN></P>Re: Seleccionar 2 filas del dado fallido@Craige_Hales
Me hiciste la vida más fácil. ¡Muchas gracias Craige!
Una última pregunta.
¿Es posible ajustar el tamaño de la plantilla dinámicamente? Estoy intentando crear una ventana con un cuadro de edición de números donde el usuario ingresará la cantidad de bordes de píxeles. Si el borde del píxel es 3, la matriz será n+1

// template for nearby points. THIS TABLE ENCODES THE 2 PIXEL BORDER.
// you might, or might not, want the corners included; the corners are
// commented out because I like the rounded appearance better.
template = [-2 -2, // corner
-2 -1, -2 0, -2 1, -2 2, // corner
-1 -2, -1 -1, -1 0, -1 1, -1 2, 0 -2, 0 -1, 0 0, // center
0 1, 0 2, 1 -2, 1 -1, 1 0, 1 1, 1 2, 2 -2, // corner
2 -1, 2 0, 2 1, 2 2 // corner
]
Re: Seleccionar 2 filas del dado fallidoesto podría funcionar:
templatesize=15;
templateround = 1; // 0: square corners 1: round corners 2: diamond corners
templatelist = {};
for(x=-templatesize, x<=templatesize, x+=1,
for(y=-templatesize, y<=templatesize, y+=1,
if(templateround==0 // use all neighbor points
| (templateround==1 & round(sqrt(x^2+y^2))<=templatesize) // use neighbors near or inside the circle
| (templateround==2 & sqrt(x^2+y^2)<=templatesize) // use neighbors inside the circle
,//
templatelist[nitems(templatelist)+1] = evallist({x,y});
)
)
);
show(templatelist);
template = matrix(templatelist);
//astable(template)<<GRAPH builder=""></GRAPH>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="capture.png" style="width: 999px;"><span class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 999px;"><img src="https://us.v-cdn.net/6038925/uploads/images/61445i7D643065AD650CD1/capture.png" role="button" title="capture.png" alt="capture.png" /></span></SPAN></P>
<P> </P>