Contrôle de la taille et du positionnement des annotations textuelles : besoin d’aideTous,
Je dois placer plusieurs annotations textuelles sur un graphique.
Ce sont des phrases d'une seule ligne, mais de longueur différente. C'est pourquoi je dois utiliser FixedSize(0) pour ajuster la longueur de l'étiquette à celle du texte.
Mais lorsque je fais cela, la hauteur est également ajustée et le texte est placé beaucoup trop haut, ce qui me gêne énormément (graphique de gauche). Si je définis Taille fixe (1), je peux contrôler directement la taille de l'étiquette et le placement du texte est correct (graphique de droite), mais comme le texte est de longueur variable, soit l'étiquette est trop longue, soit, si le texte dépasse la taille de l'étiquette, elle se bloque sur le comportement « Taille fixe (0) », ce qui est très inesthétique.


Comment ajuster le positionnement du texte dans une étiquette ET utiliser une taille fixe (0) ?
<< L'alignement vertical (« bas ») ne fonctionne pas.
Voici le code :
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = bivariate( y( :weight ), x( :height ) );
rbiv = biv << report;
taHeight = 20;
ta1 = rbiv << Add Text Annotation();
ta2 = rbiv << Add Text Annotation();
ta1 << Text( "We need to discuss this at the next meeting." );
ta1 << Text Box( {70, 80, 350, 80+taHeight} );
ta2 << Text( "We need to discuss this at the next " );
ta2 << Text Box( {70, 120, 350, 120+taHeight} );
{ta1, ta2} << Background Color( "Light Yellow" ) << Text Color( "red" )/*<
<SET wrap=""></SET>
<BR /> <BR />
<LINGO-LABS id="lingo-labs-913210" slang="en-US" mode="CREATE">
<LINGO-LABEL>Automatisation et scriptage</LINGO-LABEL>
</LINGO-LABS>
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideJe ne sais pas si vous pouvez contrôler cela dans l'annotation de texte à moins de calculer vous-même les dimensions de la zone de texte.
Pourriez-vous utiliser Graphic Script ?
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << bivariate(y(:weight), x(:height));
rbiv = biv << report;
fb = rbiv[FrameBox(1)];
fb << Add Graphics Script(
Back Color("Light Yellow");
Text Color("Red");
Text(Erased, {50, 150}, "We need to discuss this at the next meeting.");
Text(Erased, {50, 135}, "We need to discuss this at the next");
);
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideLe problème avec l'outil « Ajouter un script graphique » est que la position du texte est spécifiée en coordonnées réelles sur le graphique. Dans mon cas, ces coordonnées peuvent être n'importe lesquelles, de 1e-07 à plus de 9000 !
Je serais peut-être intéressé par l'écriture d'une fonction pour calculer les valeurs aux positions souhaitées, mais seulement si je peux ajouter une bordure autour du texte comme dans le premier exemple. Le graphique risque d'être assez chargé ; j'ai besoin de le structurer visuellement pour une lecture et un tri rapides.
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideJ'ai une idée.
Que se passe-t-il si je dessine d'abord des annotations de texte avec une taille fixe (0), que je mesure la longueur, puis que je les change en taille fixe (1), et que je définis manuellement la largeur mesurée et la hauteur souhaitée ?
Le problème est que << Get Size() renvoie des valeurs erronées :
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = bivariate( y( :weight ), x( :height ) );
rbiv = biv << report;
taHeight = 40;
ta1 = rbiv << Add Text Annotation();
ta2 = rbiv << Add Text Annotation();
ta1 << Text( "We need to discuss this at the next meeting." );
ta1 << Text Box( {70, 80, 350, 80+taHeight} );
ta2 << Text( "We need to discuss this at the next " );
ta2 << Text Box( {70, 120, 350, 120+taHeight} );
{ta1, ta2} << Background Color( "Light Yellow" ) << Text Color( "red" )/*<
<SET wrap=""></SET>
<P>Il produit :</P> //:*/
Show(ta1_x, ta2_x);
/*:
ta1_x = 328;
ta2_x = 328;
Bien que les étiquettes soient visiblement de longueur différente sur le graphique, ai-je mal compris quelque chose ?
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideEssayez d'utiliser < <>
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideVous pourrez peut-être également effectuer la vérification de la taille à l'aide d'une zone de texte dans une nouvelle fenêtre.
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = bivariate( y( :weight ), x( :height ) );
rbiv = biv << report;
taHeight = 20;
ta1 = rbiv << Add Text Annotation();
ta2 = rbiv << Add Text Annotation();
nw = new window("", << Window View("Invisible"),
tb1 = Text Box("We need to discuss this at the next meeting."),
tb2 = Text Box("We need to discuss this at the next ")
);
w1 = tb1 << Get Size;
w2 = tb2 << Get Size;
nw << close window;
ta1 << Text( "We need to discuss this at the next meeting." );
ta1 << Text Box( {70, 80, w1[1]+20+70, 80+taHeight});
ta2 << Text( "We need to discuss this at the next " );
ta2 << Text Box( {70, 120, w2[1]+20+70, 120+taHeight});
{ta1, ta2} << Background Color( "Light Yellow" ) << Text Color( "red" )/*<
<SET wrap=""></SET>
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideMerci pour le conseil, oui, je peux maintenant obtenir et définir les dimensions de l'étiquette.
Le problème, c'est que JSL ne procède pas ligne par ligne ; au contraire, il calcule en quelque sorte l'état final de chaque propriété séparément... puis l'applique.
Comme:
...
...
ta1<
<FIXED size=""></FIXED>
<P>La largeur reste donc celle que j'avais initialement définie :</P> <CODE class=" language-jsl">ta1 << Text( "We need to discuss this at the next meeting." );
ta1 << Text Box( {70, 80, 350, 80+taHeight} );
ta2 << Text( "We need to discuss this at the next " );
ta2 << Text Box( {70, 120, 350, 120+taHeight} );
L'ajout de Wait(0.5) a permis de surmonter ce problème.
Voici donc le script final :
Names Default To Here( 1 );
Open( "$SAMPLE_DATA/Big Class.jmp" );
biv = bivariate( y( :weight ), x( :height ) );
rbiv = biv << report;
taHeight = 40;
ta1 = rbiv << Add Text Annotation();
ta2 = rbiv << Add Text Annotation();
ta1 << Text( "We need to discuss this at the next meeting." );
ta1 << Text Box( {70, 80, 350, 80+taHeight} );
ta2 << Text( "We need to discuss this at the next " );
ta2 << Text Box( {70, 120, 350, 120+taHeight} );
{ta1, ta2} << Background Color( "Light Yellow" ) << Text Color( "red" )<
<FIXED size=""></FIXED> <BR />
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideCelle-ci fonctionne aussi. Subjectivement même plus rapide que ma solution. J'essaie de le mesurer avec l'outil de débogage.
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aideDéfinir Wait(0) accélère les choses - il n'y a plus d'attente réelle, mais l'écran est redessiné.
Re: Contrôle de la taille et du placement des annotations textuelles : besoin d’aidePeu importe, ça marche.
Avant les boucles :
taList = {};
À l'intérieur de la boucle :
Insert Into(taList, ta);
Après les boucles :
Wait(0);
taList << Fixed Size(1);
For Each({height, index}, taList << Get Height(),
taList[index] << Set Height(height*0.93)
);
Le problème, c'est que lors de la mise en œuvre dans un scénario réel, avec plusieurs graphiques comportant plusieurs annotations textuelles, l'application de cette astuce à chaque annotation sur une boucle à deux niveaux est trop lente.
J'ai essayé de créer une liste d'annotations textuelles :
taList={};
et ensuite, juste à l'intérieur des boucles, ajoutez le ta actuel à la liste :
Insert Into(taList, ta);
À la fin des boucles, j'ai :
taList
/*:
{DisplayBox[gtext], DisplayBox[gtext],......}
Mais les opérations sur cette liste ou sur des membres individuels ne fonctionnent pas.
Des idées ? Les miennes sont :
1. Essayez d'utiliser la zone de contexte pour séparer les variables entre les différentes tâches.
2. Extraire d'une manière ou d'une autre ces annotations du rapport - mais lorsque j'extrais le XML (<