# MultipleParentExcpetion



## cptnofuture (24. Jul 2007)

Moin!

Hab ein Problem:

Ich habe einen Vektor mit Shape3Ds. Einige davon sind gleich, wurden aber beim einfügen in den Vektor geklont und haben eine andere Position, Rotation, etc.

Jetzt will ich die Shape3Ds aus dem Vektor auslesen und jeden einzelnen einer eigenen TransformGroup zuordnen.
Allerdings kann ich jedes Shape nur einmal zuweisen, kommt in meinem Vektor das gleiche Shape (geklont, mit anderer Position, Rotation, etc.) vor und ich adde es zu einer neuen TransformGroup, so bekomme ich eine MultipleParentException, da das Shape angeblich schon einen parent hat. 

Also kann ich jede Figur nur einmal darstellen, obwohl ich sie eigentlich mehrfach, nur an anderer Stelle, anzeigen möchte.

Wüsste einer von Euch, wie das Problem zu beheben kann? Die einzelnen Shapes sind auch wirklich geklont und keine Referenzen. 

Grüße,
Sebastian


----------



## merlin2 (24. Jul 2007)

Wie klonst du die Shape3Ds?
Mit cloneTree()?


----------



## cptnofuture (24. Jul 2007)

Also es sieht so aus:

Ich hab mir eine Klasse geschrieben, die Shap3D extended. Die Daten, mit denen die Objekte gefüllt werden liegen im PDB Format vor, stellen also Proteine da.

Da ich die Daten aus den PDBs nicht ständig neu einlesen will, lese ich sie einmal ein, fülle damit das selbst gebaute Shape3D und klone es dann so oft ich es brauche und verstaue alles in einem Vektor.

Wenn man sich das ganze dann ansehen will, gehe ich den Vektor durch und baue den Graphen auf.

Die Klasse, die Shape3D erweitert implementiert clonable. die clone() methode ruft super.clone() auf. Eigentlich sollte das doch funktionieren, oder?

ich mache dann objektName.clone() und ändere die Position und Rotation des geklonten objekts und füge das in den Vektor ein.

Grüße und danke schonmal,

Sebastian


----------



## merlin2 (24. Jul 2007)

Wen du mit clone() klonst, kopierst du vermutlich auch die Referenz auf das Parent-Objekt, also tritt die Exception auf.
Bei cloneTree() passiert das meines Wissens nicht.


----------



## cptnofuture (24. Jul 2007)

Also ich clone alles, bevor es den Graphen überhaupt gibt. 

Hier mal ein wenig code, daran kann man das vielleicht besser erkennen. model ist die Klasse(bzw. hier die Instanz), die meine Daten verwaltet, darin ist der Vektor mit den Proteinen (und anderes). Aufgrund dieses Modells, in dem alle Proteine die angezeigt werden sollen mit ihren Positionen und Rotationen gespeichert sind, will ich eine 3D Darstellung machen. Nehmen wir an, es gibt drei Proteine, die jeweils dreimal vorkommen sollen, so steht dann in dem Vektor:
Prot1.1, Prot1.2, Prot1.3, Prot2.1 usw. Die will ich mir holen und die darin gespeicherte Information über Position und Rotation an die TransformGroup weitergeben. Mit dem cloneTree() hab ich jetzt zwar alle Proteine darstellen können, die ich haben will, aber ich bin mir nicht sicher, ob dann noch die verbindung zu den Proteinen in meinem Vektor besteht, für den späteren Fall, dass ich die Proteine noch manipulieren will.

Danke schonmal für die Hilfe,

Sebastian

hier ist der code:


```
BranchGroup newProts = new BranchGroup();
		this.setCapabilitysForBranchGroup(newProts);
		
		for(int i = 0; i<model.getProteinCount();i++){
		
		
			Appearance protApp = new Appearance();
			Material protMat = new Material();
			//color and appearance
			Color3f col = new Color3f(model.getProteinAt(i).getColor());
			protMat.setEmissiveColor(col);
			protMat.setAmbientColor(col);
			protMat.setDiffuseColor(col);
			protMat.setShininess(20);
			Protein_3D protS = model.getProteinAt(i);
			protApp.setMaterial(protMat);
			protS.setAppearance(protApp);

			
			if(protS.getParent()==null){
				
				//transforming...
				TransformGroup tf = new TransformGroup();
				Transform3D t3D = new Transform3D();
				//...position
				Vector3f v3f = new Vector3f(protS.getX()*CM2_CONSTANTS.J3D_ANGSTROM_SCALE, protS.getY()*CM2_CONSTANTS.J3D_ANGSTROM_SCALE, protS.getZ()*CM2_CONSTANTS.J3D_ANGSTROM_SCALE);
				
				//....rotation
	//			System.out.println(protS.getRotationMatrix());
				TransformGroup tf2 = new TransformGroup();
				Transform3D t3D2 = new Transform3D();
				Matrix3f m3f = new Matrix3f();
				
				t3D2.get(m3f);
				m3f.mul(protS.getRotationMatrix());
				t3D2.setRotation(m3f);
	//			System.out.println(m3f);
	//			System.out.println("-----ä-");
				tf2.setTransform(t3D2);
				
				//setting up together
				t3D.setTranslation(v3f);			
				tf.setTransform(t3D);
				tf.addChild(tf2);
				tf2.addChild(protS);
				newProts.addChild(tf);	
				
			}else{
				
				Node n = protS.getParent();
				Node newN = n.cloneTree(true);
				TransformGroup tg = (TransformGroup)newN;
				Transform3D t3 = new Transform3D();
				tg.getTransform(t3);
				
				Vector3f v3f = new Vector3f(protS.getX()*CM2_CONSTANTS.J3D_ANGSTROM_SCALE, protS.getY()*CM2_CONSTANTS.J3D_ANGSTROM_SCALE, protS.getZ()*CM2_CONSTANTS.J3D_ANGSTROM_SCALE);
				
				t3.setTranslation(v3f);
				tg.setTransform(t3);
				
				newProts.addChild(tg);
			}
				
		}
				
		prot.addChild(newProts);
```

PS: wenn ich den protS.getParent()==null vergleich nicht mache, dann kommt die exception
PPS: prot ist die übergeordnete BranchGroup()


----------

