Búsqueda de elementos en el cuadro de árbol¿Es posible buscar elementos en un cuadro de árbol?
El método que se muestra en el enlace a continuación busca elementos ingresados por el usuario en un cuadro de lista, pero este enfoque no se aplica a un cuadro de árbol.
Buscando elementos en el cuadro de lista
Esto se debe a que un cuadro de lista puede usar fácilmente un bucle para buscar en todos los elementos. ¿Qué métodos se pueden usar para buscar elementos en un cuadro de árbol?
El siguiente JSL es un ejemplo de creación de un cuadro de árbol 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>Automatización y scripting</LINGO-LABEL></LINGO-LABS>Re: Buscando elementos en el cuadro de árbolEs posible, ¿cómo se buscan? ¿Qué se hace después de encontrarlos?
Por ejemplo, echa un vistazo al script antiguo que mencioné aquí : Árbol de directorios: Explorar el espacio usado por las carpetas, desde mi GitHub: jthi-jmp-tools/file-indexer (GitHub) . Utiliza un cuadro de árbol y también incluye un cuadro de búsqueda. Puedes encontrar otro ejemplo de búsqueda en el complemento JSL Function List (supongo que ya está disponible en Marketplace, pero no lo uso mucho, así que no estoy seguro).
Re: Buscando elementos en el cuadro de árbolEspero que después de ingresar una palabra clave, solo se muestren los elementos que coincidan con la palabra clave y sus elementos principales, como se muestra en la siguiente figura.
Por ejemplo, cuando ingreso "agua", el cuadro del árbol solo mostrará "sandía" y su elemento principal "Fruta".

Re: Buscando elementos en el cuadro de árbol¿Has visto los ejemplos que te proporcioné?
Re: Buscando elementos en el cuadro de árbolLa información en GitHub es demasiado complicada... No puedo entender los ejemplos, solo sé que la pista debería estar en la función `search_tree`.
¿Podrías ayudarme a proporcionar un ejemplo más sencillo?
Re: Buscando elementos en el cuadro de árbolNo recuerdo si pudiste ocultar las hojas sin quitarlas, pero al menos puedes atenuarlas.
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);
);
);
Dependiendo de qué tan complicado sea el árbol que tengas, es posible que quieras considerar la recursión.
Re: Buscando elementos en el cuadro de árbolAtenuar es una buena manera de distinguir si los elementos coinciden con las palabras clave de búsqueda, pero si el número de elementos secundarios es elevado, limitarse a atenuar sus colores puede dificultar la búsqueda. Por ejemplo, al buscar la palabra clave "1" entre los elementos secundarios del 1 al 100, los elementos secundarios coincidentes, como 1, 11-19 y 100, no pueden mostrarse juntos de forma destacada.
Sería mejor si pudiéramos ocultar directamente las opciones secundarias en lugar de atenuarlas.
¿Existe actualmente una forma efectiva de ocultar directamente elementos secundarios que no coinciden como lo hace dim?
Re: Buscando elementos en el cuadro de árbol¿Has comprobado lo que ofrece Scripting Index para Tree Box() y Tree Node()? Si no recuerdo mal, no se pueden ocultar nodos en Tree Box(), así que hay que usar otros métodos para recrear el árbol con menos nodos. No es muy difícil, pero requiere JSL adicional y cierta gestión de parámetros.
Re: Buscando elementos en el cuadro de árbolQuiero proceder eliminando nodos. Cada vez que cambie la palabra clave, eliminaré el nodo de nuevo. Por ejemplo, en JSL, la primera palabra clave es 1, luego cambia a 2, pero siempre termina con un error. ¿Por qué? Según esta lógica, ¿cómo debería corregirlo?
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: Buscando elementos en el cuadro de árbolEstás eliminando el árbol y no tendrás acceso a él. En lugar de usar "duplicar = árbol", utiliza la clonación u otro método para copiar la estructura del cuadro de visualización. Debes asegurarte de que todos los nodos se clonen o copien correctamente y de que no hagan referencia a los mismos objetos (copia vs. copia profunda).
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: Buscando elementos en el cuadro de árbolEl significado parece sugerir que incluso si se utiliza el método Clone Box, no puede evitar el hecho de que cuando se elimina un nodo de árbol copiado, también se eliminan el árbol original y su raíz.
Esto significa que cada vez que se cambia una palabra clave, se debe crear un nuevo árbol y, posteriormente, eliminar los nodos que coinciden con ella. Por lo tanto, si hay muchos nodos, la búsqueda de palabras clave requiere mucho tiempo de cálculo.
¿Existen métodos alternativos para crear una copia completamente independiente del árbol original?
Re: Buscando elementos en el cuadro de árbolPuedes revisar el árbol y crear una copia manualmente (recorrer el árbol y crear una copia) o reconstruirlo con base en otra estructura de datos (por ejemplo, una tabla de datos, un array asociativo o una clase personalizada). También puedes probar si existen métodos para evitar esto mediante expresiones o funciones.
Re: Buscando elementos en el cuadro de árbolParece que solo puedo regenerar un nuevo árbol cada vez. Lo cambié al siguiente JSL y funciona correctamente cuando la palabra clave es 1, pero si introduzco 2, 4 o algo similar, no funciona. ¿Podrías decirme cuál podría ser el 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: Buscando elementos en el cuadro de árbolEste ejemplo muy rápido podría dar algunas ideas.
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: Buscando elementos en el cuadro de árbolIntenté cambiarlo al siguiente JSL. Quiero obtener el nombre de la etiqueta al presionar un botón después de seleccionar un nodo. Sin embargo, esto genera un error al seleccionar una nueva opción en el árbol después de introducir palabras clave para el filtrado, posiblemente porque `new_tree` es solo una variable local. ¿Cómo puedo solucionarlo para obtener la etiqueta seleccionada del nuevo árbol después de la búsqueda de palabras clave?
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: Buscando elementos en el cuadro de árbolTu cuadro de botones hace referencia a un cuadro de visualización incorrecto, ya que el árbol al que hace referencia se ha eliminado. Hay buenas maneras de solucionar esto actualizando la referencia, pero también puedes hacerla dinámica y buscar siempre el cuadro de árbol más reciente dentro de vlb, por ejemplo.
Button Box("Select",
label_selected = (vlb[TreeBox(1)] << get selected) << get label;
Try(ShowText << delete);
VLB2 << Append(ShowText = Text Box(label_selected));
),