Ajouter des objets horizontalementSalut,
J'ai moi-même écrit une petite visionneuse d'images pour me permettre de parcourir un dossier de photographies numériques à partir de JMP 9 et d'inclure le script ci-dessous. Le problème que j'ai est que je souhaite conserver les positions relatives de la zone de liste et de la zone graphique dans lesquelles les images sont affichées pendant l'utilisation de l'outil. Pour le moment, lorsque je sélectionne une image dans la liste pour remplacer l'image initiale, la nouvelle zone graphique est ajoutée sous la liste, alors que je souhaite qu'elle apparaisse dans la même position que je l'avais initialement placée - à droite de la liste. . Je sais pourquoi il le fait : la propriété "<< append" attache le nouveau graphique verticalement. La question est, comment puis-je modifier le script pour l'ajouter horizontalement ?
// Début du programme ;
Effacer le journal();
Dossier de photos= "C:\Mes photos\Carte appareil photo 1\102_FUJI\";
Liste d'images= Fichiers dans le répertoire(Dossier de photos ); // Chaque fichier est au format JPEG, donc pas besoin de les filtrer ;
Expr_Create_Image= Expr(
Nom de l'image = Dossier Photo || Liste d'images [ Numéro d'image ] ;
go= Boîte graphique(
Taille du cadre (410, 308 ),
Échelle X( 0, 100 ),
Échelle Y( 0, 100 ),
<<Couleur de l'arrière plan ( {0,7, 0,7, 0,7} ),
<<Ajouter une image (Ouvrir(Nom de l'image ),Limites (Gauche( 5 ), Droite( 95 ),Haut (95 ),Bas (5 ) ) )
);
// Je ne veux pas voir les axes, alors supprime-les ;
gb [ boîte d'axe (2 )] <<supprimer;
gb [ boîte d'axe (1 )] <<supprimer;
);
Expr_Replace_Chart= Expr(
nw [ Boîte Propriétaire (1 )] <<supprimer; // Supprime l'ancien de la fenêtre ;
maintenant<<ajouter ( gb ); // Ajoute le nouveau ;
);
kg= Zone de liste(
Liste d'images,
Numéro d'image=( kg<<obtenir les indices sélectionnés )[1];
Évaluer(Expr_Create_Image ); // Crée une nouvelle boîte graphique ;
Évaluer(Expr_Replace_Chart ); // Remplacez l'ancien par le nouveau graphique ;
,
maximum sélectionné (1 )
);
Numéro d'image= 1; // Afficher initialement le premier ;
Évaluer(Expr_Create_Image ); // Crée le graphique ;
kg<<définir la sélection ( ImageNumber, 1 ); // Présélectionne le premier élément de la liste ;
maintenant= Nouvelle fenetre( "Nouvelle fenetre", Zone de liste H(kg,fr ) ); // Et affiche la fenêtre ;
// Fin du programme ;
Plus généralement, existe-t-il un moyen de simplement remplacer le graphique d'origine par le nouveau de telle sorte qu'il ne soit pas nécessaire de déconstruire partiellement puis de reconstruire la fenêtre d'affichage, comme je le fais en ce moment ? La solution évidente serait simplement de remplacer l'image initiale dans la zone graphique par la nouvelle sélectionnée dans la zone de liste, mais je n'arrive pas à le faire : en utilisant la propriété "<< ajouter une image" sur la même zone graphique a la deuxième fois ne semble pas fonctionner – c'est pourquoi, en ce moment, je crée une nouvelle boîte graphique à chaque fois.
Merci beaucoup pour toutes suggestions.
Ajout d'objets horizontalementBelle petite application ! Je n'ai pas étudié la généralisation du problème (modifier au lieu de remplacer gb), mais j'ai apporté une petite modification qui semble conserver la disposition horizontale. Dans le script ci-dessous, j'affiche simplement les lignes modifiées.
...
Expr_Replace_Chart = Expr (
nw [ OwnerBox ( 1 )] << supprimer ; // Supprimez l'ancien de la fenêtre ;
hlb << append ( gb ) ; // Ajouter le nouveau à la liste déroulante H
);
...
essayer ( Évaluer ( Expr_Create_Image )) ; // Créer le graphique ; // J'ai inclus ceci dans try pour éviter un message d'erreur la première fois
...
nw = Nouvelle fenêtre ( "Nouvelle fenêtre" , hlb = Liste déroulante H ( kg , gb ) ) ; // Et afficher la fenêtre ; Donner une référence à la liste H
...
Ajout d'objets horizontalementExcellent ! Merci beaucoup ! (En fait, ce serait plus utile en général, notamment en déterminant les dimensions de chaque image lors de son chargement : si je pouvais le faire, je pourrais créer chaque graphique avec le bon rapport hauteur/largeur à chaque fois, au lieu d'avoir toutes les photos prises en mode portrait écrasées au format paysage, comme c'est le cas actuellement. Je ne vois pas comment faire ça spontanément, mais cela ne signifie pas que ce soit impossible. Si quelqu'un sait comment faire, pourriez-vous me montrer comment ?)
Encore une fois, merci beaucoup,
David
Re: Ajout d'objets horizontalementVoici un exemple (modification de votre idée originale) qui utilise une image<
Liste d'images = Fichiers dans le répertoire ( PhotoFolder = Sélectionner un répertoire () ) ;
NuméroImage = 1 ;
Expr_Créer_Image = Expr (
NomImage = DossierPhoto || ListeImage [ NuméroImage ] ;
img = Ouvrir ( NomImage , jpg ) ;
taille_image = image << getsize ;
Si ( taille_img [ 1 ] > taille_img [ 2 ] ,
img << définir la taille ( { 410 , 308 } ) ,
img << définir la taille ( { 308 , 410 } )
);
pb = Boîte Image ( img ) ;
bb = Boîte de panneau ( , pb ) ;
);
Expr_replace_image = Expr (
nw[Boîte de panneau( 1 )] << delete;
hlb << ajouter ( bb ) ;
);
lb = Boîte de liste (
Liste d'images ,
NuméroImage = ( lb << obtenir les indices sélectionnés )[ 1 ] ;
Évaluer ( Expr_Créer_Image ) ;
Évaluation( Expr_replace_image );,
max sélectionné ( 1 )
);
Évaluation( Expr_Create_Image );
nw = Nouvelle fenêtre ( "test" , hlb = Boîte de liste H ( lb , bb ) ) ;
Re: Ajout d'objets horizontalementParfait ! C'est exactement ce qu'il me fallait, et en plus, ça simplifie les choses. Un grand merci !
Ajout horizontal d'objetsC'était amusant. Au risque d'alourdir votre application, je propose également une version avec des boutons pour faire pivoter et zoomer l'image. La touche Alt inverse l'action.
Liste d'images = Fichiers dans le répertoire ( PhotoFolder = Sélectionner un répertoire () ) ;
NuméroImage = 1 ;
Expr_pb = Expr ( pb = Boîte de panneau ( , Boîte à images ( img ) ) ) ;
Expr_Créer_Image = Expr (
NomImage = DossierPhoto || ListeImage [ NuméroImage ] ;
img = Ouvrir ( NomImage , jpg ) ;
taille_image = image << getsize ;
Si ( taille_img [ 1 ] > taille_img [ 2 ] ,
img << définir la taille ( { 410 , 308 } ) ,
img << définir la taille ( { 308 , 410 } )
);
Expr_pb ;
);
Expr_replace_image = Expr (
nw[Boîte de panneau( 1 )] << delete;
hlb << ajouter ( pb ) ;
);
rotation = Boîte à boutons ( "Rotation" ,
Si ( Est la touche Alt () ,
img << rotation ( - 90 ) ,
img << rotation ( 90 )
);
Expr_pb ;
Expr_remplacer_image ;
);
zoom = Boîte de boutons ( « Zoom ») ,
Si ( Est la touche Alt () ,
img << définir la taille ( Liste d'évaluation ( {( img << obtenir la taille )[ 1 ] / 1.5 , ( img << obtenir la taille )[ 2 ] / 1.5 } ) ) ,
img << set size ( Liste d'évaluation ( {( img << get size )[ 1 ] * 1.5 , ( img << get size )[ 2 ] * 1.5 } ) )
);
Expr_pb ;
Expr_remplacer_image ;
);
rotation << définir l'astuce ( "Rotation de 90° à droite, maintenir la touche alt pour une rotation de 90° à gauche" ) ;
zoom << Définir l'astuce ( "appuyez pour augmenter la taille, maintenez la touche alt enfoncée pour la diminuer" ) ;
lb = Boîte de liste (
Liste d'images ,
NuméroImage = ( lb << obtenir les indices sélectionnés )[ 1 ] ;
Expr_Créer_Image ;
Expr_remplacer_image ;,
max sélectionné ( 1 )
);
Expr_Créer_Image ;
nw = Nouvelle fenêtre ( "test" , hlb = Boîte de liste H ( Boîte de liste V ( lb , rotate , zoom ) , pb ) ) ;
Re: Ajout d'objets horizontalementC'est génial ! Je viens d'intégrer ce code dans une application que je développe actuellement, qui servira de navigateur de fichiers graphiques polyvalent. Le seul changement que j'apporterai probablement sera de généraliser le format (410 x 308) afin de s'adapter à toutes les dimensions d'entrée, car les images que je consulte peuvent inclure des exportations de boîtes graphiques JMP, qui peuvent en principe avoir n'importe quelle taille. Pourquoi ne pas soumettre une copie de ce code sur le File Exchange ? Vous trouverez ici des exemples pratiques d'utilisation des Picture Boxes, d'échange de composants dans une fenêtre de sortie et d'utilisation de… clé, et il n'est pas difficile d'imaginer de nombreuses utilisations potentielles.
Encore une fois, un grand merci !