Re: MouseBox Seleccionando Múltiples ImágenesTambién puede usar las funciones JSL isShiftKey, isAltKey, isControlKey para administrar la decisión rojo / blanco. El bucle para recopilar la selección podría ejecutarse en la liberación del botón. Creo que es "Liberar", imprima la variable del botón para verificar ... lejos del escritorio ...
Re: MouseBox Seleccionando Múltiples ImágenesMuchas gracias por ponerme en el camino correcto.
Cambié un poco el código para que el usuario pueda elegir seleccionar o anular la selección, en lugar de anular la selección automática de todo.
Así que supongo que el siguiente problema viene con el seguimiento de la selección. Vea el código a continuación, parece funcionar, pero me parece incómodo.
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 Seleccionando Múltiples Imágenes
Es posible que deba desactivar la función de traducción de la página en la parte superior de la página antes de tomar este código. La magia está en las últimas líneas; todo lo demás está configurado. Al final, << getChildBox (ubicación) se está utilizando en un bucle para una cuadrícula de píxeles (cada 10 píxeles X e Y) dentro del rango seleccionado con el mouse hasta la ubicación actual del mouse. getChildBox devuelve 1, 2 o 3 cuadros en este ejemplo, dependiendo de si el píxel está en un mapa de bits (tercer cuadro) o solo en un borde (segundo cuadro), o solo en la alineación secundaria del cuadro del mouse (primer cuadro). Si se encuentra un segundo cuadro, haga que tenga un fondo rojo. Observe también el bucle justo antes de eso que borra todos los cuadros a blanco. Este código se ejecuta tanto en movimientos del mouse como en un tic del temporizador; El argumento "botón" dice por qué se llama a la función. Presionado es la ubicación del mouse-down. lb [borderbox (1)] << getbackgroundcolor le dirá si un cuadro es rojo o blanco cuando ocurre el evento Release. También puede agregar una etiqueta de texto. Tenga en cuenta el borde izquierdo ... los valores inferiores se establecen en función del tamaño de la imagen para centrar la imagen. Eso necesitará algunos ajustes si se agrega texto.
Si necesita más control, el cuadro de gráficos con segmentos de imagen y trampa para ratones podría ser una alternativa.
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 Selección de múltiples imágenesQuiero seleccionar múltiples imágenes usando un mousebox.
A continuación, se muestra un ejemplo que describí cómo se puede seleccionar una imagen de una en una. Pero dado que podría haber potencialmente cientos de imágenes, quiero que mi usuario pueda seleccionar varias imágenes con una función de arrastre en lugar de tener que hacer clic en cada una. ¿Algun consejo?
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>