Ricerca di elementi nella casella AlberoÈ possibile cercare elementi in una casella ad albero?
Il metodo illustrato nel collegamento sottostante ricerca gli elementi immessi dall'utente in una casella di riepilogo, ma questo approccio non è applicabile a una casella ad albero.
Ricerca di elementi nella casella di riepilogo
Questo perché una casella di riepilogo può facilmente utilizzare un ciclo per cercare tra tutti gli elementi. Quali metodi si possono utilizzare per cercare elementi in una casella ad albero?
Il seguente JSL è un esempio di creazione di un semplice tree box.
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>Automazione e scripting</LINGO-LABEL></LINGO-LABS>Re: Ricerca di elementi nella casella AlberoÈ fattibile, come desideri cercarli? Cosa vuoi fare dopo averli trovati?
Ad esempio, date un'occhiata al vecchio script che ho menzionato qui , "Directory Tree: Explore Space Used by Folders", dal mio github: jthi-jmp-tools/file-indexer (github) . Utilizza un box ad albero e ha anche una casella di ricerca. Un altro esempio di ricerca si può trovare nel componente aggiuntivo JSL Function List (presumo che sia disponibile al momento nel Marketplace, ma non lo uso molto, quindi non ne sono sicuro).
Re: Ricerca di elementi nella casella AlberoSpero che dopo aver inserito una parola chiave, vengano visualizzati solo gli elementi che corrispondono alla parola chiave e ai relativi elementi padre, come mostrato nella figura sottostante.
Ad esempio, se inserisco "acqua", nella casella dell'albero verranno visualizzati solo "anguria" e il suo elemento padre "Frutta".

Re: Ricerca di elementi nella casella AlberoHai guardato gli esempi che ho fornito?
Re: Ricerca di elementi nella casella AlberoLe informazioni su GitHub sono troppo complicate... non riesco a capire gli esempi, so solo che l'indizio dovrebbe essere nella funzione `search_tree`.
Potresti fornirmi un esempio più semplice?
Re: Ricerca di elementi nella casella AlberoNon ricordo se sei riuscito a nascondere le foglie senza rimuoverle, ma almeno puoi oscurarle
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);
);
);
A seconda di quanto è complicato l'albero che hai, potresti voler esaminare la ricorsione
Re: Ricerca di elementi nella casella AlberoL'attenuazione è un buon metodo per distinguere se gli elementi corrispondono alle parole chiave di ricerca, ma se il numero di elementi è elevato, basarsi solo sull'attenuazione dei colori può rendere difficile concentrarsi sui risultati di ricerca. Ad esempio, quando si cerca la parola chiave "1" tra gli elementi da 1 a 100, gli elementi corrispondenti come 1, 11-19 e 100 non possono essere visualizzati in modo evidente insieme.
Sarebbe meglio se potessimo nascondere direttamente le opzioni figlio per renderle più scure.
Esiste attualmente un modo efficace per nascondere direttamente gli elementi figlio non corrispondenti come fa dim?
Re: Ricerca di elementi nella casella AlberoHai controllato cosa offre Scripting Index per Tree Box() e Tree Node()? Se non ricordo male, non è possibile nascondere i nodi in Tree Box(), quindi bisogna usare altri metodi per ricreare l'albero con meno nodi. Non è troppo difficile, ma richiederà codice JSL aggiuntivo e un po' di gestione dei parametri.
Re: Ricerca di elementi nella casella AlberoVoglio procedere rimuovendo i nodi. Ogni volta che la parola chiave cambia, rimuoverò di nuovo il nodo. Ad esempio, in JSL, la prima parola chiave è 1, poi cambia in 2, ma finisce sempre con un errore. Perché? Secondo questa logica, come dovrei correggerlo?
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: Ricerca di elementi nella casella AlberoStai eliminando l'albero e non avrai più accesso ad esso. Invece di duplicate = tree, usa la clonazione o un altro metodo per copiare la struttura del display box. Devi assicurarti che tutti i nodi vengano clonati/copiati correttamente e che non facciano riferimento agli stessi oggetti (copia vs copia profonda).
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: Ricerca di elementi nella casella AlberoIl significato sembra suggerire che, anche se si utilizza il metodo Clone Box, non è possibile evitare il fatto che quando si rimuove un nodo dell'albero copiato, vengono rimossi anche l'albero originale e la sua radice.
Ciò significa che ogni volta che una parola chiave viene modificata, è necessario creare un nuovo albero e quindi rimuovere i nodi che corrispondono alla parola chiave. Di conseguenza, se i nodi sono molti, la ricerca delle parole chiave diventa molto dispendiosa in termini di tempo e risorse.
Esistono metodi alternativi per creare una copia completamente indipendente dell'albero originale?
Re: Ricerca di elementi nella casella AlberoÈ possibile accedere al riquadro dell'albero e creare una copia "manualmente" (eseguire un ciclo sull'albero e creare una copia) o ricostruirla in base a un'altra struttura dati (ad esempio, una tabella dati, un array associativo o una classe personalizzata). In alternativa, è possibile verificare se esistono metodi per impedire che ciò accada utilizzando espressioni o funzioni.
Re: Ricerca di elementi nella casella AlberoSembra che riesca a rigenerare solo un nuovo albero ogni volta. L'ho modificato con il seguente codice JSL e funziona correttamente quando la parola chiave è 1, ma se inserisco 2, 4 o qualcosa di simile, non funziona. Potresti indicarmi quale potrebbe essere il problema?
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: Ricerca di elementi nella casella AlberoQuesto esempio molto rapido potrebbe dare qualche idea
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: Ricerca di elementi nella casella AlberoHo provato a modificarlo con il seguente codice JSL. Voglio ottenere il nome dell'etichetta premendo un pulsante dopo aver selezionato un nodo. Tuttavia, questo genera un errore quando si seleziona una nuova opzione nell'albero dopo aver inserito le parole chiave per il filtro, probabilmente perché `new_tree` è solo una variabile locale. Come posso risolvere il problema in modo da ottenere l'etichetta selezionata dal nuovo albero dopo la ricerca per parola chiave?
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: Ricerca di elementi nella casella AlberoLa tua Button Box fa riferimento a una casella di visualizzazione errata, poiché l'albero a cui fa riferimento è stato eliminato. Esistono validi modi per aggirare questo problema aggiornando il riferimento, ma puoi anche renderlo dinamico e cercare sempre l'albero più recente all'interno di VLB, ad esempio.
Button Box("Select",
label_selected = (vlb[TreeBox(1)] << get selected) << get label;
Try(ShowText << delete);
VLB2 << Append(ShowText = Text Box(label_selected));
),