Re : Sélectionnez 2 lignes du dé défaillantPeut-être quelque chose comme ça
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 ) ) ) );
Vous pourriez vouloir ceci

ou cela, voir la ligne commentée pour le calcul de la distance. Cela dépend de la manière dont vous souhaitez traiter la distance diagonale.

Re : Sélectionnez 2 lignes du dé défaillantMerci beaucoup Craig
Sélectionnez 2 lignesSalut la communauté JMP,
Je souhaite mettre en évidence deux points de données à partir de chacune des coordonnées X et Y du bac de défaillance "2". J'ai essayé d'écrire un code jsl, mais les résultats ne sont pas corrects.
Le code ci-dessous met en évidence plus de deux points de données à partir des coordonnées X et Y du bac de défaillance "2". Aucune suggestion?
Voici le code
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" );
Merci,
Jacky
Automatisation et scriptRe : Sélectionner 2 lignes d'un dé défaillant je ne comprends pas ce que vous voulez dire par la sélection de 2 matrices dans la région défaillante - Je veux une bordure plus épaisse.
Ainsi, par exemple, si je sélectionne « 40 » dans la légende (voir ci-dessous), alors je souhaite ajouter une bordure épaisse de +2 dés entourant cette région. Cette carte de plaquette particulière a les coordonnées X et Y en négatif et cela fonctionne avec la fonction nearFailure()

Zoomé un peu :
Quelque chose comme ça. J'ai sélectionné manuellement 2 points dans la région sélectionnée, qui dans ce cas est des points de données rouges Bin "40". L'intention est donc d'appliquer une exclusion de +2 matrices (une bordure épaisse) entourant la région de ligne sélectionnée.

Quelque chose de similaire à ce que vous avez mentionné, dans le cas ci-dessous, il y a une bordure épaisse (rouge)

Re : Sélectionner 2 lignes d'un dé défaillantJe pense que l'option 2 aurait plus de sens. J'apprécierais que vous puissiez partager la logique matricielle modifiée pour le gros patch. Je ne sais pas exactement comment résoudre ce problème
Re : Sélectionner 2 lignes d'un dé défaillantVous pourriez essayer quelque chose comme ça. C'est une meilleure approche, je pense, mais elle comportera probablement son propre ensemble de problèmes, alors testez attentivement.
// 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 : Sélectionner 2 lignes d'un dé défaillant@Craige_Hales
Vous m'avez rendu la vie plus facile. Merci beaucoup, Craige!
Une dernière question.
Est-il possible d'ajuster la taille du modèle de manière dynamique ? J'essaie de créer une fenêtre avec une zone d'édition de nombres dans laquelle l'utilisateur entrera le nombre de bordures de pixels. Si la bordure des pixels est 3, la matrice sera 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 : Sélectionner 2 lignes d'un dé défaillantcela pourrait fonctionner:
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>