Have you set the capabilities to allow deleting these branchGroups?
bg1.setCapability(BranchGroup.ALLOW_DETACH);
bg2.setCapability(BranchGroup.ALLOW_DETACH);
Im not sure, but you may also need to set:
rootTG.setCapability(Group.ALLOW_CHILDREN_WRITE);
Lisa
dao wrote:
> Hi, all
> I have a Java3D Scene graph like this
>
> Locale
> |
> |
> rootBG
> |
> |
> rootTG
> / \
> / \
> Behavior1--- BG1 BG2 ---- Behavior2
> \ / \ /
> \ / \ /
> TG1 TG2
> | |
> Shape3D1 Shape3D2
>
> The goal is to delete the Shape3D2 from a PickResult object generated
> by a PickCanvas.
> For this purpose I have extended the Behavior class.
> Then I recover the SceneGraphPath from PickResult and I get the
> terminal node ?
> When this one is Shape3D, I search the corresponding BG here (BG1 or
> BG2) then remove it from the local.
> The strange think occurs is that after deleting, the Shape3D remaining
> can't be delete and does not
> reponse any more to my behavior class. This is two classes used for
> deleting.
>
> import java.io.*;
> import java.awt.*;
> import java.awt.event.*;
> import java.util.*;
> import javax.media.j3d.*;
> import javax.vecmath.*;
> import javax.swing.*;
> import com.sun.j3d.utils.behaviors.mouse.*;
> import com.sun.j3d.utils.picking.*;
> import com.sun.j3d.utils.picking.behaviors.*;
> import com.sun.j3d.utils.geometry.*;
> import javax.media.j3d.*;
>
> /** This class is made for use with the class Tools. It is used to link GUI
> * components such as buttons and menu items to methods of the class
> Tools.
> */
> public class ToolsBehavior extends Behavior
> { float size=0.5f;
> private static double sphereDistance = 0.1;
> PickCanvas pickCanvas;
> PickResult[] pickResult = null;
> BranchGroup rootBranchGroup;
> javax.media.j3d.Locale locale;
> public SceneCreator creator = null;
> boolean intersectOrNot = false;
> PickResult[] intersectPickResult = null;
> private SceneGraphPath path;
> private Node node;
> private PickIntersection pi;
> private Point3d eyePos;
> private String doAction = "Delete";
>
> /** Constructs a ToolsBehavior object by giving it references to
> Canvas3D,
> * Locale, BranchGroup.
> *
> * @param canvas3D The Canvas3D object used to interact with the scene.
> * @param locale The Locale object of the scene.
> * @param branchGroup The root of the objects to handle.
> */
> public ToolsBehavior(Canvas3D canvas3D, javax.media.j3d.Locale locale,
> BranchGroup branchGroup, SceneCreator sc)
> {
> rootBranchGroup = branchGroup;
> this.locale = locale;
> creator = sc;
> pickCanvas = new PickCanvas(canvas3D, branchGroup);
> pickCanvas.setTolerance(2.0f);
> pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO);
> }
>
> /** Initialising method.
> *
> */
> public void initialize()
> { wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED));
> }
>
> /** Process Stimulus meothod.
> *
> */
> public void processStimulus (Enumeration criteria)
> { WakeupCriterion wakeup;
> AWTEvent[] event;
> int eventId;
> while (criteria.hasMoreElements())
> { wakeup = (WakeupCriterion) criteria.nextElement();
> if (wakeup instanceof WakeupOnAWTEvent)
> { event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
> for (int i= event.length; i-- > 0; )
> { eventId = event[i].getID();
> if (eventId == MouseEvent.MOUSE_PRESSED){
> if (((MouseEvent)event[i]).getModifiers() ==
> MouseEvent.BUTTON3_MASK)
> {
> int x = ((MouseEvent)event[i]).getX();
> int y = ((MouseEvent)event[i]).getY();
> pickCanvas.setShapeLocation(x, y);
> eyePos = pickCanvas.getStartPosition ();
> pickResult = pickCanvas.pickAllSorted();
> if (pickResult != null)
> System.out.println("Picked True ");
> if (doAction.equals("Delete") &&( pickResult != null))
> Tools.deleteObject(pickResult);
> }
> }
> } //endfor
> }
> }//endwhile
> wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED));
> }
>
> I put to BG1 and BG2 an instance of toolBehavior.
>
> public class Tools {
> ..
> .....
>
> /** Method that deletes the object picked by user. (Class Tools)
> *
> * @param pickResult array of PickResult objects according to the
> user selection.
> */
> public static void deleteObject(PickResult[] pickResult){
> if (pickResult != null){ if (pickResult != null){ // Check if the
> ray intersects an object.
> toolPATH = pickResult.getSceneGraphPath();
> toolNODE = toolPATH.getObject();
> if ( toolNODE instanceof Shape3D ) {
>
>
>SceneCreator.l.removeBranchGraph((BranchGroup)pickResult.getNode(pickResult.BRANCH_GROUP));
>
> }
> }
> }
>
> }//End Tools
>
> SceneCreator is a class that creates Virtual universe, locale, rootBG
> and rootTG and view branchGroup.
>
> Is anybody can give me the best way to delete Shape3D1 or Shape3D2 or
> the errors in my code.
>
> Thanks for all.
>
> ===========================================================================
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
> of the message "signoff JAVA3D-INTEREST". For general help, send email to
> [EMAIL PROTECTED] and include in the body of the message "help".
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".