L'aide avec JSL Throw() ne fonctionne pas comme prévuChers tous,
(JMP Pro 16.1.0, Win10)
J'ai un problème lié à un de mes précédents messages ici , si vous êtes intéressé par une "histoire en arrière".
Le principal problème que j'ai maintenant est que la commande Throw() ne fonctionne pas comme prévu. Dans mon code (voir à la fin pour le code complet), j'ai à quelques endroits un test pour voir s'il existe actuellement un rapport de générateur de graphes ouvert, ressemble à ceci, et il est enveloppé dans une instruction Expr() :
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
Le problème est que chaque fois que j'exécute le code (comme si je l'exécutais à partir d'un bouton de la barre d'outils), il semble ignorer ces lignes et ignore s'il n'y a pas de rapport ouvert. Mais, lorsque j'exécute le code "ligne par ligne", il détecte correctement qu'aucun rapport n'est ouvert et avertit l'utilisateur.
J'essaie d'écrire du code à distribuer aux utilisateurs de mon organisation et d'essayer de le rendre suffisamment robuste pour gérer différents types de situations, par exemple si un utilisateur a une ou plusieurs tables de données ouvertes et/ou un ou plusieurs projets ouverts (qui peut contenir plusieurs tables de données).
Voici le concept du code (le problème se produit au point 6) : un utilisateur crée un graphique dans Graph Builder, puis souhaite effectuer une modification de routine du graphique (voir le lien ci-dessus pour plus de détails à ce sujet), l'utilisateur clique alors sur la barre d'outils bouton de raccourci pour effectuer ladite action.
- Le code exécute l'expression Graphic_Expr pour déterminer l'emplacement du graphique -- est-ce dans une table de données "autonome" ou dans un projet (une seule option peut être sélectionnée). -> (aller à)
- Selon la case à cocher sélectionnée, le code exécute ensuite le code dt_win_Expr ou prj_win_Expr (pour le moment, je ne l'ai configuré que pour l'option de table de données pendant que je teste le code, mais idéalement, il devrait fonctionner plus ou moins la même chose à la fin) . -> (aller à)
- S'il s'agit d'une table de données autonome, il exécute dt_win_Expr et crée une fenêtre permettant à l'utilisateur de sélectionner la table de données dans laquelle réside le graphique qu'il souhaite modifier. Rappelez-vous que l'utilisateur peut avoir plus d'une table de données ouverte avec potentiellement plus d'un Graph Builder ouvert. | (ou)
- De même, si l'utilisateur sélectionne un projet, il exécutera le prj_win_Expr (pas encore terminé) pour que l'utilisateur sélectionne quel projet (si plusieurs sont ouverts) et les tables de données suivantes dans ce projet. -> (aller à)
- Une fois qu'une table de données est sélectionnée, qu'elle soit autonome ou dans un projet, le code exécute l'expression SquarifyWin_Expr. La première chose qu'il fait ici est de tester s'il existe en fait un rapport actuel - le code If() ci-dessus (je devrai peut-être modifier et tester si le rapport actuel est un générateur de graphiques ou non). ** C'est là que le code ne fonctionne PAS comme prévu. Même s'il n'y a pas de Graph Builder ouvert, il continuera avec le reste du code lorsqu'il devrait lancer l'avertissement.** Si tout fonctionne....-> (aller à)
- En fonction des dimensions en pixels et de la mise au carré, le code exécute ensuite l'expression RprtUpdate_Expr, où il envoie les mises à jour souhaitées au rapport du générateur de graphiques.
J'espère que cette description a du sens et aide à mettre en contexte le chemin/la fonctionnalité de programmation que je souhaite.
Un grand merci d'avance pour toute aide dans la recherche d'une solution. Code JSL complet à la fin.
Merci!,
DS
Names Default To Here( 1 );
Clear Symbols();
RprtUpdate_Expr = Expr(
gb = Current Report()[Outline Box( 1 )] << Get Scriptable Object;
Report( gb )[framebox( 1 )] << FrameSize( widthN, heightN );
theMax = Max( Report( gb )[axisbox( 1 )] << get max, Report( gb )[axisbox( 2 )] << get max );
theMin = Min( Report( gb )[axisbox( 1 )] << get min, Report( gb )[axisbox( 2 )] << get min );
Report( gb )[framebox( 1 )] << Xaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << Yaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << AddGraphicsScript(
xmin = X Origin();
xmax = X Origin() + X Range();
ymin = Y Origin();
ymax = Y Origin() + Y Range();
Pen Color( "blue" );
Pen Size( 1 );
Line Style( "solid" );
Line( {xmin, ymin}, {xmax, ymax} );
);
);
SquarifyWin_Expr = Expr(
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
nwin = New Window( "Enter Size of Desired Graph",
<<RETURN result=""></RETURN>Personnalisation de masseRe : L'aide avec JSL Throw() ne fonctionne pas comme prévuSalut @jthi et @David_Burnham ,
Merci à vous deux pour vos retours et vos idées. J'aime la mini fenêtre modale, elle s'est avérée utile lors des tests pour voir si N'IMPORTE QUEL générateur de graphiques était ouvert.
J'ai décidé de changer les choses et j'ai totalement réécrit le code. Il fait maintenant ce que je veux, mais il garde également une trace à travers des tableaux associatifs quelle instance de générateur de graphes est pour quel projet. Avec les tables de données, même avec plusieurs ouvertures, il n'y a aucun problème à faire la distinction entre les différentes instances de Graph builder, même au sein d'une seule table de données, mais comme les projets ont plusieurs onglets, je devais m'assurer de l'affectation du grab builder objet inscriptible a été associé au bon projet. J'étais plutôt content de pouvoir utiliser les AA et qu'ils m'aident aussi ! Le nouveau code modifie également la première fenêtre selon que vous n'avez ouvert que des tables de données (ou des projets) ou les deux.
C'était une belle petite entreprise et j'ai aimé y travailler. Après l'avoir testé un peu plus, je partagerai avec mon organisation. Ci-dessous le code si vous êtes intéressé. Je n'arrivais pas à comprendre comment faire fonctionner For Each() en passant par tous les projets possibles, puis par toutes les fenêtres d'un projet, j'ai donc fait des boucles For() à la place.
Merci!,
DS
//JSL to add diagonal line and automatically resize to desired size
//Written by SDF1 with help/input from jthi, txnelson, Craige_Hales, David_Burnham, and Mark_Bailey
Names Default To Here( 1 );
Clear Symbols();
lb_width = 80;
Lines_n = 6;
mmw = Function( {title, text, text_icon = "BlankIndex", window_icon = "NewApplication"},
{Default Local},
New Window( title,
<<MODAL></MODAL>Re : L'aide avec JSL Throw() ne fonctionne pas comme prévuExemple d'analyse des fenêtres du générateur de graphes :
getGraphBuilderWindows = function({},{default local},
lst = {};
winList = getWindowList();
for each({win},winList,
winTitle = win << getWindowTitle;
if (contains(winTitle,"Graph Builder"),
insertinto(lst,win)
)
);
return(lst);
);
lstGBWindows = getGraphBuilderWindows();Re : L'aide avec JSL Throw() ne fonctionne pas comme prévuSachez également que CurrentReport recherchera toutes les fenêtres ouvertes, y compris celles que vous créez.Vous devrez inspecter l'arborescence d'affichage (par exemple, OutlineBox(1)) pour identifier une fenêtre en tant que Graph Builder, et si vous avez ouvert d'autres fenêtres, il se peut qu'elle ne soit pas actuelle, alors cherchez peut-être dans une liste de fenêtres ouvertes.
Re : L'aide avec JSL Throw() ne fonctionne pas comme prévuEssayez de mettre des diagnostics dans votre code.
je mets
show ( Current Report() );
avant votre test, et il a rapporté ceci:
Current Report() = DisplayBox[HeadBox];
Pas vide.
Re : L'aide avec JSL Throw() ne fonctionne pas comme prévuAvez-vous vérifié s'il y a des impressions dans le journal JMP ? Le lancer peut se déclencher mais il n'y a tout simplement pas de "fenêtre d'erreur". Au moins lorsque je travaille avec des compléments, j'utilise une fenêtre modale d'erreur personnalisée car Throw ne crée pas de fenêtre d'erreur comme lorsqu'il est exécuté en tant que script.
Dialogues modaux a une fonction d'alerte assez simple que vous pouvez utiliser à la place de Throw (vous pouvez également lancer mais utiliser la fenêtre modale pour montrer l'erreur à l'utilisateur).
Modifier:
J'ai trouvé une fonction que j'ai utilisée pour les fenêtres modales d'informations :
Names Default To Here(1);
mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
New Window(title, <<MODAL></MODAL>