Re: MouseBox Auswählen mehrerer BilderSie können auch die JSL-Funktionen isShiftKey, isAltKey, isControlKey verwenden, um die Rot / Weiß-Entscheidung zu verwalten. Die Schleife zum Sammeln der Auswahl kann mit der Tastenfreigabe ausgeführt werden. Ich denke es ist "Release", drucken Sie die Button-Variable aus, um zu überprüfen ... weg vom Schreibtisch ...
Betreff: MouseBox Auswählen mehrerer BilderVielen Dank, dass Sie mich auf den richtigen Weg gebracht haben.
Ich habe den Code ein wenig geändert, damit der Benutzer auswählen oder die Auswahl aufheben kann, anstatt automatisch die Auswahl aller Elemente aufzuheben.
Also ich denke das nächste Problem kommt mit der Verfolgung der Auswahl. Siehe den folgenden Code, es scheint zu funktionieren, aber es fühlt sich für mich einfach unangenehm an.
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>Betreff: MouseBox Auswählen mehrerer Bilder
Möglicherweise müssen Sie die Seitenübersetzungsfunktion oben auf der Seite deaktivieren, bevor Sie diesen Code abrufen können. Die Magie ist in den letzten paar Zeilen; alles andere ist eingerichtet. Am Ende wird << getChildBox (location) in einer Schleife für ein Pixelraster (alle 10 Pixel X und Y) innerhalb des mit der Maus ausgewählten Bereichs bis zur aktuellen Mausposition verwendet. getChildBox gibt in diesem Beispiel 1, 2 oder 3 Boxen zurück, je nachdem, ob sich das Pixel in einer Bitmap (3. Box) oder nur in einem Rahmen (2. Box) oder nur im untergeordneten Lineup der Mausbox (1. Box) befindet. Wenn ein zweites Feld gefunden wird, muss es rot hinterlegt sein. Beachten Sie auch die Schleife kurz davor, die alle Kästchen in Weiß löscht. Dieser Code wird bei beiden Mausbewegungen und einem Timer-Tick ausgeführt. Das Argument "button" gibt an, warum die Funktion aufgerufen wird. Gedrückt wird die Position, an der der Mauszeiger gedrückt wird. lb [borderbox (1)] << getbackgroundcolor zeigt an, ob eine Box beim Eintreten des Release-Ereignisses rot oder weiß ist. Sie können auch eine Textbezeichnung hinzufügen. Beachten Sie, dass die Werte für den linken unteren Rand ... auf der Grundlage der Bildgröße festgelegt werden, um das Bild zu zentrieren. Das muss angepasst werden, wenn Text hinzugefügt wird.
Wenn Sie mehr Kontrolle benötigen, ist die Grafikbox mit Bildsegmenten und Mausefalle möglicherweise eine 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 Auswählen mehrerer BilderIch möchte mehrere Bilder mit einer Mausbox auswählen.
Unten sehen Sie ein Beispiel, das ich als Skript erstellt habe und das zeigt, wie Sie ein Bild nach dem anderen auswählen können. Da es jedoch möglicherweise Hunderte von Bildern geben kann, möchte ich, dass mein Benutzer mehrere Bilder mit einer Ziehfunktion auswählen kann, anstatt auf jedes einzelne klicken zu müssen. Irgendwelche Tipps?
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>