Re: MouseBox Sélection de plusieurs imagesvous pouvez également utiliser les fonctions JSL isShiftKey, isAltKey, isControlKey pour gérer la décision rouge / blanc. La boucle pour rassembler la sélection pourrait être exécutée sur le bouton relâché. Je pense que c'est "Release", imprimer la variable de bouton pour vérifier ... loin du bureau ...
Re: MouseBox Sélection de plusieurs imagesMerci beaucoup de m'avoir mis sur le bon chemin.
J'ai un peu modifié le code pour que l'utilisateur puisse choisir de sélectionner ou de désélectionner, au lieu de tout désélectionner automatiquement.
Donc, je suppose que le problème suivant vient avec le suivi de la sélection. Voir le code ci-dessous, cela semble fonctionner, mais cela me semble gênant.
mb << setclick(
Function( {this, coords, button},
If( button == "Pressed",
{pressedX, pressedY} = coords;
Try(
pressedBox = mb << getchildbox( {pressedX, pressedY} );
pressedBoxColor = pressedBox[2] << GetBackgroundColor;
);
,
{thisX, thisY} = coords;
xstart = Min( thisX, pressedX ) - 5;
xstop = Max( thisX, pressedX ) + 5;
xstep = 10;
ystart = Min( thisY, pressedY ) - 5;
ystop = Max( thisY, pressedY ) + 5;
ystep = 10;
// turn off all previous selections
//for( b=lb<<CHILD>= 2,
If( pressedBoxColor == "Red",
boxes[2] << setbackgroundcolor( "white" ),
boxes[2] << setbackgroundcolor( "red" )
)
);
)
);
)
)
);
selection = J( 1, 200, 0 );
counter = 0;
For( b = lb << child, !Is Empty( b ), b = b << sib,
counter++;
If( (b << getbackgroundcolor) == "Red",
selection[counter] = 1
);
);</CHILD>Re: MouseBox Sélection de plusieurs images
Vous devrez peut-être désactiver la fonctionnalité de traduction de page en haut de la page avant de récupérer ce code. La magie est dans les dernières lignes; tout le reste est configuré. À la fin, << getChildBox (emplacement) est utilisé dans une boucle pour une grille de pixels (tous les 10 pixels X et Y) dans la plage sélectionnée par la souris jusqu'à l'emplacement actuel de la souris. getChildBox retourne 1, 2 ou 3 cases dans cet exemple, selon que le pixel est dans une image bitmap (3ème case) ou juste dans une bordure (2ème case), ou simplement dans l'enfant de la palette de la souris (1ère case). Si une seconde boîte est trouvée, faites-en un fond rouge. Notez également la boucle juste avant qui efface toutes les cases en blanc. Ce code fonctionne sur les deux mouvements de souris et une coche de minuterie; l'argument "button" explique pourquoi la fonction est appelée. Appuyez sur est l'emplacement de la souris vers le bas. lb [borderbox (1)] << getbackgroundcolor vous indiquera si une boîte est rouge ou blanche lorsque l'événement Release se produit. Vous pouvez aussi ajouter une étiquette de texte. Notez que la bordure gauche ... les valeurs inférieures sont définies en fonction de la taille de l'image pour centrer l'image. Cela nécessitera quelques ajustements si du texte est ajouté.
Si vous avez besoin de plus de contrôle, la zone de graphique avec des segments d’image et une souris peut être une alternative.
New Window( "selection test", mb = MouseBox( lb = Lineup Box( N Col( 10 ) ) ) );
// generate some pictures of various sizes
For( i = 1, i < 200, i++,
rows = Random Uniform( 10, 100 );
cols = Random Uniform( 10, 100 );
ls = (120 - cols) / 2;
rs = 120 - cols - ls;
ts = (120 - rows) / 2;
bs = 120 - rows - ts;
red = J( rows, cols, Random Uniform( 0, 1 ) );
green = J( rows, cols, Random Uniform( 0, 1 ) );
blue = J( rows, cols, Random Uniform( 0, 1 ) );
lb << append(
Border Box( sides( 15 ), Left( ls ), Right( rs ), top( ts ), bottom( bs ), New Image( "rgb", {red, green, blue} ) )
);
);
mb << setclickenable( 1 );
mb << setclick(
Function( {this, coords, button},
If( button == "Pressed",
{pressedX, pressedY} = coords,
{thisX, thisY} = coords;
xstart = Min( thisX, pressedX ) - 5;
xstop = Max( thisX, pressedX ) + 5;
xstep = 10;
ystart = Min( thisY, pressedY ) - 5;
ystop = Max( thisY, pressedY ) + 5;
ystep = 10;
// turn off all previous selections
For( b = lb << child, !Is Empty( b ), b = b << sib,
b << setbackgroundcolor( "white" )
);
// test points in the selection box
For( x = xstart, x <= xstop, x += xstep,
For( y = ystart, y <= ystop, y += ystep,
boxes = mb << getchildbox( {x, y} );
If( N Items( boxes ) >= 2,
boxes[2] << setbackgroundcolor( "red" )
);
)
);
)
)
);
MouseBox Sélection de plusieurs imagesJe veux sélectionner plusieurs images à l'aide d'un mousebox.
Voici un exemple de script montrant comment on peut sélectionner une image à la fois. Mais comme il pourrait y avoir potentiellement des centaines d’images, je veux que mon utilisateur puisse sélectionner plusieurs images avec une fonction glisser au lieu de devoir cliquer sur chacune d’elles. Des conseils?
Names Default To Here( 1 );
//dtFull contains image path information
dtFull = Current Data Table();
path1 = dtFull:LocalPath[20];
path2 = dtFull:LocalPath[21];
path3 = dtFull:LocalPath[22];
path4 = dtFull:LocalPath[23];
img = New Image( path1 );
img2 = New Image( path2 );
img3 = New Image( path3 );
img4 = New Image( path4 );
selected = [0, 0, 0, 0];
New Window( "test",
H List Box(
vlb = V List Box(
mb = MouseBox(
pb = Picture Box( img ),
<<SETCLICKENABLE></SETCLICKENABLE>