Suchen von Elementen im BaumfeldIst es möglich, in einer Baumbox nach Elementen zu suchen?
Die im folgenden Link gezeigte Methode sucht in einem Listenfeld nach vom Benutzer eingegebenen Elementen. Dieser Ansatz gilt jedoch nicht für ein Baumfeld.
Elemente in der Listbox suchen
Dies liegt daran, dass eine Listbox problemlos eine Schleife verwenden kann, um alle Elemente zu durchsuchen. Welche Methoden können verwendet werden, um nach Elementen in einer Treebox zu suchen?
Das folgende JSL ist ein Beispiel für die Erstellung einer einfachen Baumbox.
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>Automatisierung und Skripting</LINGO-LABEL></LINGO-LABS>Betreff: Elemente in der Baumstruktur suchenEs ist möglich. Wie möchten Sie nach ihnen suchen? Was möchten Sie tun, nachdem sie gefunden wurden?
Schauen Sie sich zum Beispiel das alte Skript an, das ich hier erwähnt habe : „Directory Tree: Explore Space Used by Folders“ von meinem GitHub: jthi-jmp-tools/file-indexer (github) . Es verwendet eine Baumstruktur und verfügt auch über ein Suchfeld. Ein weiteres Beispiel für die Suche finden Sie im JSL Function List Add-In (ich nehme an, es ist mittlerweile im Marketplace verfügbar, aber ich nutze den Marketplace nicht wirklich, daher bin ich mir nicht sicher).
Betreff: Elemente in der Baumstruktur suchenIch hoffe, dass nach der Eingabe eines Schlüsselworts nur die Elemente angezeigt werden, die dem Schlüsselwort und ihren übergeordneten Elementen entsprechen, wie in der folgenden Abbildung dargestellt.
Wenn ich beispielsweise „Wasser“ eingebe, werden in der Baumbox nur „Wassermelone“ und das übergeordnete Element „Obst“ angezeigt.

Betreff: Elemente in der Baumstruktur suchenHaben Sie sich die Beispiele angesehen, die ich bereitgestellt habe?
Betreff: Elemente in der Baumstruktur suchenDie Informationen in GitHub sind zu kompliziert … Ich kann die Beispiele nicht verstehen, ich weiß nur, dass der Hinweis in der Funktion „search_tree“ liegen sollte.
Könnten Sie bitte ein einfacheres Beispiel liefern?
Betreff: Elemente in der Baumstruktur suchenIch weiß nicht mehr, ob man Blätter verstecken konnte, ohne sie zu entfernen, aber man konnte sie zumindest dimmen
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);
);
);
Je nachdem, wie kompliziert Ihr Baum ist, sollten Sie sich mit Rekursion befassen.
Betreff: Elemente in der Baumstruktur suchenDurch Abdunkeln lässt sich gut erkennen, ob Elemente den Suchbegriffen entsprechen. Bei einer großen Anzahl von untergeordneten Elementen kann es jedoch schwierig sein, sich auf die Suchergebnisse zu konzentrieren, wenn man sich nur auf das Abdunkeln ihrer Farben verlässt. Wenn Sie beispielsweise unter den untergeordneten Elementen von 1 bis 100 nach dem Schlüsselwort „1“ suchen, können die passenden untergeordneten Elemente wie 1, 11–19 und 100 nicht zusammen hervorgehoben angezeigt werden.
Es wäre besser, wenn wir die untergeordneten Optionen direkt ausblenden könnten, anstatt sie abzudunkeln.
Gibt es derzeit eine effektive Möglichkeit, nicht übereinstimmende untergeordnete Elemente direkt auszublenden, wie es Dim tut?
Betreff: Elemente in der Baumstruktur suchenHast du geprüft, was Scripting Index für Tree Box() und Tree Node() bietet? Soweit ich mich erinnere, können Knoten in Tree Box() nicht ausgeblendet werden. Du musst also andere Methoden verwenden, um den Baum mit weniger Knoten neu zu erstellen. Das ist nicht allzu schwierig, erfordert aber zusätzliches JSL und etwas Parameterverwaltung.
Betreff: Elemente in der Baumstruktur suchenIch möchte Knoten entfernen. Jedes Mal, wenn sich das Schlüsselwort ändert, entferne ich den Knoten erneut. Beispielsweise ist in JSL das erste Schlüsselwort 1, dann ändert es sich zu 2, aber es endet immer mit einem Fehler. Warum ist das so? Wie kann ich das nach dieser Logik korrigieren?
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 );
Betreff: Elemente in der Baumstruktur suchenSie löschen den Baum und haben keinen Zugriff mehr darauf. Verwenden Sie anstelle von „Duplizieren = Baum“ das Klonen oder eine andere Methode zum Kopieren der Anzeigefeldstruktur. Stellen Sie sicher, dass alle Knoten korrekt geklont/kopiert werden und dass sie nicht auf dieselben Objekte verweisen (Kopie vs. Deep Copy).
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
Betreff: Elemente in der Baumstruktur suchenDie Bedeutung scheint darauf hinzudeuten, dass selbst bei Verwendung der Clone-Box-Methode nicht vermieden werden kann, dass beim Entfernen eines kopierten Baumknotens auch der ursprüngliche Baum und seine Wurzel entfernt werden.
Dies bedeutet, dass bei jeder Änderung eines Schlüsselworts ein neuer Baum erstellt werden muss und anschließend die Knoten, die mit dem Schlüsselwort übereinstimmen, entfernt werden müssen. Wenn also viele Knoten vorhanden sind, wird die Suche nach Schlüsselwörtern rechenintensiv.
Gibt es alternative Methoden, um eine völlig unabhängige Kopie des Originalbaums zu erstellen?
Betreff: Elemente in der Baumstruktur suchenSie können die Baumstruktur manuell bearbeiten und eine Kopie erstellen (durchlaufen und eine Kopie erstellen) oder sie basierend auf einer anderen Datenstruktur (z. B. Datentabelle, assoziatives Array, eigene benutzerdefinierte Klasse) neu erstellen. Alternativ können Sie versuchen, dies mithilfe von Ausdrücken/Funktionen zu verhindern.
Betreff: Elemente in der Baumstruktur suchenEs scheint, dass ich jedes Mal nur einen neuen Baum generieren kann. Ich habe es in das folgende JSL geändert, und es funktioniert einwandfrei, wenn das Schlüsselwort 1 ist. Wenn ich jedoch 2, 4 oder etwas Ähnliches eingebe, funktioniert es nicht. Könnten Sie mir bitte mitteilen, wo das Problem liegen könnte?
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 />Betreff: Elemente in der Baumstruktur suchenDieses sehr kurze Beispiel könnte einige Ideen vermitteln
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">
Betreff: Elemente in der Baumstruktur suchenIch habe versucht, es in folgendes JSL zu ändern. Ich möchte den Beschriftungsnamen per Knopfdruck nach Auswahl eines Knotens erhalten. Dies führt jedoch zu einem Fehler beim Auswählen einer neuen Option im Baum nach Eingabe von Schlüsselwörtern zum Filtern, möglicherweise weil „new_tree“ nur eine lokale Variable ist. Wie kann ich das Problem beheben, damit ich nach der Schlüsselwortsuche die ausgewählte Beschriftung aus dem neuen Baum abrufen kann?
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>Betreff: Elemente in der Baumstruktur suchenIhre Button-Box verweist auf die falsche Anzeigebox, da der zugehörige Baum gelöscht wurde. Sie können dies durch Aktualisieren der Referenz umgehen, sie aber auch dynamisch gestalten und beispielsweise immer nach der neuesten Baumbox in vlb suchen.
Button Box("Select",
label_selected = (vlb[TreeBox(1)] << get selected) << get label;
Try(ShowText << delete);
VLB2 << Append(ShowText = Text Box(label_selected));
),