# TransformGroup finden und bearbeiten



## RobDom (23. Sep 2007)

Hallo,

ich habe wahrscheinlich ein ganz einfaches Problem:

Ich will in meiner BranchGroup eine TransformGroup finden und die Transform3D verändern.


```
// .....
for (int i = 0; i < branchGroup.numChildren; i++) {
     if (branchGroup.getChild(i).getName == "name") {
          branchGroup.getChild(i).setTransform(transform3D);
          }
     }
// .....
```

liefert leider einen Fehler, weil .getChild immer den Typ Node zurückliefert und nicht TransformGroup.

Wie kann ich das lösen und auf die gefundene TransformGroup zugreifen??

- Nein ich kann nicht direkt über den Name darauf zugreifen...
- Ja alle Capabilities sind gesetzt...

Gruß und Dank


----------



## merlin2 (23. Sep 2007)

```
if (branchGroup.getChild(i).getName == "name" && branchGroup.getChild(i) instanceof TransformGroup) { 
   ((TransformGroup)branchGroup.getChild(i)).setTransform(transform3D); 
}
```


----------



## RobDom (23. Sep 2007)

Vielen Dank für die schnelle Antwort, so klappt's   

Weisst Du vielleicht auch, wie man den Graphen durch alle Ebenen durchsucht,
um eine TransformGroup zu finden?? Bei anderen Sprachen gibt es z.B. Methoden
wie .nextTransversal, die in die nächste Ebene springt.


----------



## Marco13 (23. Sep 2007)

Du solltest IMHO den Graphen überhaupt nicht durchsuchen. Wenn du eine TransformGroup nachträglich ändern willst, dann speichere eine Referenz darauf, und benutz' DIE dann..

```
class XXX
{
    TransformGroup x;
     void erstelle()
     {
         ....
         x = new TransformGroup(...);
         rootBranchGroup.add(x);
         ...
     }

      void ändere()
      {
           x.setTransform(...)
      }
}
```


----------



## RobDom (24. Sep 2007)

...das geht leider nicht, weil ich erst über Benutzereingabe erfahre,
welche Trafo geändert werden soll. Der User kann alle Trafos über 
TextFeld anwählen und über ScrollBars ändern...


----------



## Marco13 (24. Sep 2007)

Hm. Klingt gewagt. Jedenfalls kannst du dir deine eigene rekursive Suche basteln, sinngemäß etwa sowas wie

```
findNode(Node node, String name)
{
    if (node.name == name) return node;
    for (all children c of node) 
    {
        Node n = findNode(c, name);
        if (n!= null) return n;
    }
    return null;
}

// Aufruf:
Node n = findNode(wurzel, "Test");
```

Was passiert, wenn zwei Knoten den gleichen Namen haben ... naja....


----------



## RobDom (25. Sep 2007)

> for (all children c of node)


...genau danach hab ich gesucht, wenn das auch die children der children usw.
berücksichtigt !?!
Ja klingt gewagt, ist es vielleicht auch, aber zumindest treten keine doppelten Namen auf,
weil ich die nach Funktion und Ebene indiziert benenne.
Ich werds mal probieren, was besser geht:
- zur Laufzeit durchsuchen, oder
- Instanzen auf alle TGs

Schon mal Danke


----------



## Marco13 (25. Sep 2007)

RobDom hat gesagt.:
			
		

> > for (all children c of node)
> 
> 
> ...genau danach hab ich gesucht, wenn das auch die children der children usw.
> berücksichtigt !?!


Durch den rekursiven Aufruf, ja. 

In einer Mischung aus trace und PSeudocode sieht das dann so aus:

```
findNode(ebene_/*1*/_)
{
    for (all children c of node)
    {
        // c ist in ebene_/*2*/_
        Node n = findNode(c, name); // Hier wird findNode mit einem child aufgerufen - d.h. es geht so weiter:


        findNode(ebene_/*2*/_)
        {
             for (all children c of node)
            {
                 // c ist in ebene_/*3*/_
                Node n = findNode(c, name); // Hier wird findNode mit einem child aufgerufen - d.h. es geht so weiter:



                findNode(ebene_/*3*/_) ...
```


----------



## RobDom (26. Sep 2007)

Danke für die Mühe...

...habs aber dann doch über Instanzen gelöst.
Ist zwar viel was ich dann doppelt mache, aber da der User erst zur Laufzeit
die TGs anlegt und auch steuert und weil es meistens viele Ebenen gibt, war
ein Durchsuchen zur Laufzeit etwas langwierig...


----------

