Recherche d'éléments dans la boîte d'arbreEst-il possible de rechercher des éléments dans une boîte d’arbre ?
La méthode présentée dans le lien ci-dessous recherche les éléments saisis par l'utilisateur dans une zone de liste, mais cette approche ne s'applique pas à une zone d'arbre.
Recherche d'éléments dans une liste déroulante
En effet, une liste déroulante peut facilement utiliser une boucle pour parcourir tous les éléments. Quelles méthodes peuvent être utilisées pour rechercher des éléments dans une liste déroulante ?
Le JSL suivant est un exemple de création d’une boîte d’arbre simple.
dt=New Table( "Food Tree",
Add Rows( 8 ),
New Column( "Name",
Character,
"Nominal",
Set Selected,
Set Values(
{"Apple", "Banana", "Watermelon", "Fruit", "Broccoli", "Lettuce",
"Potato", "Vegetable"}
)
),
New Column( "Category",
Character,
"Nominal",
Set Values(
{"Fruit", "Fruit", "Fruit", "", "Vegetable", "Vegetable", "Vegetable",
""}
)
),
New Column( "Level",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [2, 2, 2, 1, 2, 2, 2, 1] )
),
Set Row States( [0, 0, 0, 1, 0, 0, 0, 0] )
);
relations = [=>];
For Each Row( dt,
relations[:Name] = Tree Node( :Name );
relations[:Name] <<SET data="https://community.jmp.com/"></SET>
<P><SPAN><BR /><BR /></SPAN></P><LINGO-LABS id="lingo-labs-867118" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisation et scripts</LINGO-LABEL></LINGO-LABS>Re : Recherche d'éléments dans la zone ArbreC'est faisable, comment souhaitez-vous les rechercher ? Que souhaitez-vous faire une fois qu'ils sont trouvés ?
Par exemple, jetez un œil à l'ancien script que j'ai mentionné ici , « Arborescence des répertoires : explorer l'espace utilisé par les dossiers », sur mon GitHub : jthi-jmp-tools/file-indexer (GitHub) . Il utilise une arborescence et dispose également d'un champ de recherche. Un autre exemple de recherche est disponible dans le module complémentaire JSL Function List (je suppose qu'il est actuellement disponible sur Marketplace, mais je ne l'utilise pas vraiment, donc je n'en suis pas sûr).
Re : Recherche d'éléments dans la boîte d'arborescenceJ'espère qu'après avoir saisi un mot-clé, seuls les éléments correspondant au mot-clé et leurs éléments parents seront affichés, comme indiqué dans la figure ci-dessous.
Par exemple, lorsque je saisis « eau », la boîte de l’arbre affichera uniquement « pastèque » et son élément parent « fruit ».

Re : Recherche d'éléments dans la zone ArbreAvez-vous regardé les exemples que j’ai fournis ?
Re : Recherche d'éléments dans la zone ArbreLes informations sur GitHub sont trop compliquées... Je ne comprends pas les exemples, je sais seulement que l'indice devrait être dans la fonction `search_tree`.
Pourriez-vous s'il vous plaît m'aider à fournir un exemple plus simple ?
Re : Recherche d'éléments dans la boîte d'arborescenceJe ne me souviens pas si vous pouviez cacher les feuilles sans les enlever, mais vous pouvez au moins les atténuer.
Names Default To Here(1);
root1 = Tree Node("Parent 1");
root2 = Tree Node("Parent 2");
c1 = Tree Node("Child 1");
c2 = Tree Node("Child 2");
c3 = Tree Node("Child 3");
c4 = Tree Node("Child 4");
root1 << Append(c1);
root1 << Append(c2);
root2 << Append(c3);
root2 << Append(c4);
nw = New Window("TreeBox",
tree = Tree Box({root1, root2}, Size(300, 200))
);
tree << Expand(root1);
tree << Expand(root2);
search_term = " 1";
For Each({root}, tree << get roots,
is_hidden = 1;
For(i = 1, i <= root << Get Child Count, i++,
cur_child = root << get child(i);
If(Contains(cur_child << get label, search_term),
tree << make visible(cur_child);
is_hidden = 0;
,
cur_child << Set Dimmed(1);
);
);
If(is_hidden,
tree << Collapse(root);
,
tree << Expand(root);
);
);
Selon la complexité de votre arbre, vous souhaiterez peut-être envisager la récursivité.
Re : Recherche d'éléments dans la boîte d'arborescenceL'atténuation est un bon moyen de déterminer si les éléments correspondent aux mots-clés recherchés. Cependant, si le nombre d'enfants est important, se contenter d'atténuer leurs couleurs peut rendre les résultats de recherche difficiles à cerner. Par exemple, lors d'une recherche du mot-clé « 1 » parmi les enfants de 1 à 100, les enfants correspondants comme 1, 11-19 et 100 ne peuvent pas être affichés ensemble de manière visible.
Il serait préférable que nous puissions masquer directement les options enfants plutôt que de les atténuer.
Existe-t-il actuellement un moyen efficace de masquer directement les éléments enfants non correspondants comme le fait dim ?
Re : Recherche d'éléments dans la boîte d'arborescenceAvez-vous vérifié ce que Scripting Index propose pour Tree Box() et Tree Node() ? Si je me souviens bien, il est impossible de masquer les nœuds dans Tree Box(). Il faut donc utiliser d'autres méthodes pour recréer l'arbre avec moins de nœuds. Ce n'est pas trop difficile à réaliser, mais cela nécessite du JSL supplémentaire et une certaine gestion des paramètres.
Re : Recherche d'éléments dans la boîte d'arborescenceJe souhaite supprimer des nœuds. Chaque fois que le mot-clé change, je supprime à nouveau le nœud. Par exemple, en JSL, le premier mot-clé est 1, puis il passe à 2, mais cela génère systématiquement une erreur. Pourquoi ? Selon cette logique, comment dois-je corriger cela ?
Names Default To Here(1);
root1 = Tree Node("Parent 1");
root2 = Tree Node("Parent 2");
c1 = Tree Node("Child 1");
c2 = Tree Node("Child 2");
c3 = Tree Node("Child 11");
c4 = Tree Node("Child 4");
root1 << Append(c1);
root1 << Append(c2);
root2 << Append(c3);
root2 << Append(c4);
nw = New Window("TreeBox",
vlb = V List Box();
);
search_term = " 1";
tree = Tree Box({root1, root2}, Size(300, 200));
tree << Expand(root1);
tree << Expand(root2);
treeDuplicate=tree;
For Each({root}, treeDuplicate << get roots,
is_hidden = 1;
For(i = 1, i <= root << Get Child Count, i++,
cur_child = root << get child(i);
If(Contains(cur_child << get label, search_term),
is_hidden = 0;
,
cur_child << remove;
);
);
If(is_hidden,
treeDuplicate << Collapse(root);
,
treeDuplicate << Expand(root);
);
);
vlb << append(treeDuplicate );
wait(3);
treeDuplicate<< delete;
wait(3);
search_term = " 2";
treeDuplicate=tree;
For Each({root}, treeDuplicate << get roots,
is_hidden = 1;
For(i = 1, i <= root << Get Child Count, i++,
cur_child = root << get child(i);
If(Contains(cur_child << get label, search_term),
is_hidden = 0;
,
cur_child << remove;
);
);
If(is_hidden,
treeDuplicate << Collapse(root);
,
treeDuplicate << Expand(root);
);
);
vlb << append(treeDuplicate );
Re : Recherche d'éléments dans la zone ArbreVous supprimez l'arbre et vous n'y aurez plus accès. Au lieu de dupliquer = arbre, utilisez le clonage ou une autre méthode de copie de la structure de la boîte d'affichage. Assurez-vous que tous les nœuds sont correctement clonés/copiés et qu'ils ne font pas référence aux mêmes objets (copie ou copie complète).
Names Default To Here(1);
root1 = Tree Node("Parent 1");
root2 = Tree Node("Parent 2");
c1 = Tree Node("Child 1");
c2 = Tree Node("Child 2");
c3 = Tree Node("Child 11");
c4 = Tree Node("Child 4");
root1 << Append(c1);
root1 << Append(c2);
root2 << Append(c3);
root2 << Append(c4);
nw = New Window("TreeBox",
vlb = V List Box();
);
tree = Tree Box({root1, root2}, Size(300, 200));
tree << Expand(root1);
tree << Expand(root2);
treeDuplicate = tree;
treeDuplicate1 = tree << clone box;
show(
treeDuplicate == tree,
treeDuplicate1 == tree,
treeDuplicate << get roots == tree << get roots,
treeDuplicate1 << get roots == tree << get roots
);
treeDuplicate == tree = 1;
treeDuplicate1 == tree = 0;
treeDuplicate << get roots == tree << get roots = 1;
treeDuplicate1 << get roots == tree << get roots = 1; // be careful here
Re : Recherche d'éléments dans la boîte d'arborescenceLa signification semble suggérer que même si la méthode Clone Box est utilisée, elle ne peut pas éviter le fait que lorsqu'un nœud d'arbre copié est supprimé, l'arbre d'origine et sa racine sont également supprimés.
Cela signifie que chaque fois qu'un mot-clé est modifié, un nouvel arbre doit être établi, puis les nœuds correspondants sont supprimés. Par conséquent, si le nombre de nœuds est élevé, la recherche de mots-clés devient très chronophage.
Existe-t-il des méthodes alternatives pour créer une copie totalement indépendante de l’arbre d’origine ?
Re : Recherche d'éléments dans la zone ArbreVous pouvez parcourir l'arborescence et créer une copie « manuellement » (boucle sur l'arborescence et création d'une copie) ou la reconstruire à partir d'une autre structure de données (table de données, tableau associatif ou votre propre classe personnalisée, par exemple). Vous pouvez également essayer d'éviter ce problème en utilisant des expressions ou des fonctions.
Re : Recherche d'éléments dans la zone ArbreIl semble que je ne puisse régénérer qu'un nouvel arbre à chaque fois. J'ai utilisé le JSL suivant, et cela fonctionne correctement avec le mot-clé 1, mais si je saisis 2, 4 ou un mot similaire, cela échoue. Pourriez-vous m'indiquer le problème ?
root1 = Tree Node( "Parent 1" );
root2 = Tree Node( "Parent 2" );
c1 = Tree Node( "Child 1" );
c2 = Tree Node( "Child 2" );
c3 = Tree Node( "Child 11" );
c4 = Tree Node( "Child 4" );
filter_itemsSensorListTree = Function( {this, searchText},
{filtered_items, i},
// only attempt to filter if there is any text
If( searchText != "",
tree << delete;
search_term = searchText;
root1 = Tree Node( "Parent 1" );
root2 = Tree Node( "Parent 2" );
c1 = Tree Node( "Child 1" );
c2 = Tree Node( "Child 2" );
c3 = Tree Node( "Child 11" );
c4 = Tree Node( "Child 4" );
root1 << Append( c1 );
root1 << Append( c2 );
root2 << Append( c3 );
root2 << Append( c4 );
tree = Tree Box( {root1, root2}, Size( 300, 200 ) );
For Each( {root}, tree << get roots,
is_hidden = 1;
For( i = 1, i <= root << Get Child Count, i++,
cur_child = root << get child( i );
If( Contains( cur_child << get label, search_term ),
is_hidden = 0,
cur_child << remove
);
);
If( is_hidden,
tree << Collapse( root ),
tree << Expand( root )
);
);
vlb << append( tree );
,
);
);
root1 << Append( c1 );
root1 << Append( c2 );
root2 << Append( c3 );
root2 << Append( c4 );
tree = Tree Box( {root1, root2}, Size( 300, 200 ) );
tree << Expand( root1 );
tree << Expand( root2 );
nw = New Window( "TreeBox",
H List Box(
Icon Box( "SearchIndex" ),
Spacer Box( size( 5, 10 ) ),
item_search_teb_AllSensorTree = Text Edit Box( "",
<<SET width=""></SET>
<BR />Re : Recherche d'éléments dans la zone ArbreCet exemple très rapide pourrait donner quelques idées
Names Default To Here(1);
initialize_tree = function({}, {Default Local},
root1 = Tree Node("Parent 1");
root2 = Tree Node("Parent 2");
c1 = Tree Node("Child 1");
c2 = Tree Node("Child 2");
c3 = Tree Node("Child 11");
c4 = Tree Node("Child 4");
root1 << Append(c1);
root1 << Append(c2);
root2 << Append(c3);
root2 << Append(c4);
tree = Tree Box({root1, root2}, Size(300, 200));
tree << Expand(root1);
tree << Expand(root2);
return(tree);
);
filter_itemsSensorListTree = Function({vlb, search_term}, {Default Local},
If(search_term != "",
new_tree = initialize_tree();
For Each({root}, new_tree << get roots,
For(i = root << Get Child Count, i >= 1 , i--,
cur_child = root << get child(i);
If(Contains(cur_child << get label, search_term),
new_tree << Make Visible(cur_child);
,
cur_child << remove;
);
);
If(root << Get Child Count == 0,
new_tree << remove root(root);
);
);
,
new_tree = initialize_tree();
);
vlb_new = V List Box(new_tree);
vlb << Inval;
(vlb << Child) << Delete Box();
vlb << Append(vlb_new);
vlb << Update Window;
);
nw = New Window( "TreeBox",
H List Box(
Icon Box( "SearchIndex" ),
Spacer Box( size( 5, 10 ) ),
item_search_teb_AllSensorTree = Text Edit Box("",
<<SET width=""></SET>
<P><CODE class=" language-jsl">
Re : Recherche d'éléments dans la boîte d'arborescenceJ'ai essayé de le remplacer par le JSL suivant. Je souhaite obtenir le nom de l'étiquette en appuyant sur un bouton après avoir sélectionné un nœud. Cependant, cela génère une erreur lors de la sélection d'une nouvelle option dans l'arbre après la saisie de mots-clés pour le filtrage, probablement parce que « new_tree » n'est qu'une variable locale. Comment puis-je corriger ce problème pour obtenir l'étiquette sélectionnée dans le nouvel arbre après la recherche par mot-clé ?
Names Default To Here( 1 );
initialize_tree = Function( {},
{Default Local},
root1 = Tree Node( "Parent 1" );
root2 = Tree Node( "Parent 2" );
c1 = Tree Node( "Child 1" );
c2 = Tree Node( "Child 2" );
c3 = Tree Node( "Child 11" );
c4 = Tree Node( "Child 4" );
root1 << Append( c1 );
root1 << Append( c2 );
root2 << Append( c3 );
root2 << Append( c4 );
tree = Tree Box( {root1, root2}, Size( 300, 200 ) );
tree << Expand( root1 );
tree << Expand( root2 );
Return( tree );
);
filter_itemsSensorListTree = Function( {vlb, search_term},
{Default Local},
If( search_term != "",
new_tree = initialize_tree();
For Each( {root}, new_tree << get roots,
For( i = root << Get Child Count, i >= 1, i--,
cur_child = root << get child( i );
If( Contains( cur_child << get label, search_term ),
new_tree << Make Visible( cur_child ),
cur_child << remove
);
);
If( root << Get Child Count == 0,
new_tree << remove root( root )
);
);
,
new_tree = initialize_tree()
);
vlb_new = V List Box( new_tree );
vlb << Inval;
(vlb << Child) << Delete Box();
vlb << Append( vlb_new );
vlb << Update Window;
);
nw = New Window( "TreeBox",
H List Box(
Icon Box( "SearchIndex" ),
Spacer Box( size( 5, 10 ) ),
item_search_teb_AllSensorTree = Text Edit Box( "",
<<SET width=""></SET>Re : Recherche d'éléments dans la boîte d'arborescenceVotre boîte de boutons fait référence à une mauvaise boîte d'affichage, car l'arborescence à laquelle elle fait référence a été supprimée. Il existe une solution efficace pour contourner ce problème : mettre à jour la référence, mais vous pouvez aussi la rendre dynamique et toujours rechercher la dernière boîte d'arborescence dans vlb, par exemple.
Button Box("Select",
label_selected = (vlb[TreeBox(1)] << get selected) << get label;
Try(ShowText << delete);
VLB2 << Append(ShowText = Text Box(label_selected));
),