001/**
002    Draws the specified geometry element in the 3D scene.  The existing scene can 
003    be erased by passing an "erase" flag.  The versions showing
004    the array input actually take a variable length argument list (vararg), so you can 
005    enter draw(geom1, geom2, geom3, geom4), etc.
006    
007    @method void draw(GeomElement geom, boolean erase)
008    @method void draw(GeomElement geometry)
009    @method void draw(GeomElement... geomVararg)
010    @method void draw(boolean erase, GeomElement... geomVararg)
011    @method void draw(GeomPoint origin, Vector vector)
012    @method void draw(GeomPoint origin, ParameterVector vector)
013    @method void draw(ControlPoint cp)
014    @method void draw(ControlPointNet cpNet)
015    @method void draw(List list)
016*/
017package geomss.app.GeomSSCommands;
018
019import bsh.*;
020import geomss.GeomSSScene;
021import geomss.geom.*;
022import geomss.geom.nurbs.ControlPoint;
023import geomss.geom.nurbs.ControlPointNet;
024import jahuwaldt.js.param.ParameterVector;
025import java.util.List;
026
027public class draw {
028
029    public static String usage() {
030        return "usage: draw(geom);, or draw(geom, erase);, or draw(geomVararg);, or draw(erase, geomVararg);";
031    }
032
033    /**
034        Implement draw( GeomElement geom, boolean erase ) command.
035    */
036    public static void invoke( Interpreter env, CallStack callstack,
037                GeomElement geom, boolean erase ) throws EvalError {
038                
039        //  Get a reference to the current 3D scene.
040        GeomSSScene gScene = (GeomSSScene)env.get("gScene");
041        
042        gScene.draw(geom, erase);
043    }
044
045    /**
046        Implement draw( boolean erase, GeomElement... geom ) command.
047    */
048    public static void invoke( Interpreter env, CallStack callstack,
049                boolean erase, GeomElement... geomVararg ) throws EvalError {
050                
051        //  Get a reference to the current 3D scene.
052        GeomSSScene gScene = (GeomSSScene)env.get("gScene");
053        
054        //  Loop over the geometry to be drawn.
055        for (GeomElement geom : geomVararg) {
056            gScene.draw(geom, erase);
057        }
058    }
059
060    /**
061        Implement draw( GeomElement... geom ) command.
062    */
063    public static void invoke( Interpreter env, CallStack callstack,
064                GeomElement... geomVararg ) throws EvalError {
065        invoke(env, callstack, false, geomVararg);
066    }
067
068    /**
069        Implement draw( GeomPoint origin, Vector vector ) command.
070    */
071    public static void invoke( Interpreter env, CallStack callstack,
072                GeomPoint origin, GeomVector vector ) throws EvalError {
073                
074        //  Get a reference to the current 3D scene.
075        GeomSSScene gScene = (GeomSSScene)env.get("gScene");
076        
077        Point o = vector.getOrigin();
078        vector.setOrigin(origin.immutable());
079        gScene.draw(vector);
080        vector.setOrigin(o);
081    }
082
083    /**
084        Implement draw( GeomPoint origin, ParameterVector vector ) command.
085    */
086    public static void invoke( Interpreter env, CallStack callstack,
087                GeomPoint origin, ParameterVector vector ) throws EvalError {
088                
089        //  Get a reference to the current 3D scene.
090        GeomSSScene gScene = (GeomSSScene)env.get("gScene");
091        
092        PointString str = PointString.newInstance();
093        str.add(origin);
094        str.add(origin.plus(Point.valueOf(vector)));
095        gScene.draw(origin);
096        gScene.draw(str);
097    }
098    
099    /**
100        Implement draw( ControlPoint cp ) command.
101    */
102    public static void invoke( Interpreter env, CallStack callstack,
103                ControlPoint cp ) throws EvalError {
104        invoke(env, callstack, cp.getPoint());
105    }
106    
107    /**
108        Implement draw(ControlPointNet cpNet) command.
109    */
110    public static void invoke( Interpreter env, CallStack callstack,
111                ControlPointNet cpNet ) throws EvalError {
112        for (List column : cpNet) {
113            for (Object cp : column)
114                invoke(env,callstack, ((ControlPoint)cp).getPoint());
115        }
116    }
117    
118    /**
119        Implement draw(List list) command.
120    */
121    public static void invoke( Interpreter env, CallStack callstack,
122                List list ) throws EvalError {
123
124        if (list instanceof GeomElement) {
125            //  Get a reference to the current 3D scene.
126            GeomSSScene gScene = (GeomSSScene)env.get("gScene");
127            gScene.draw((GeomElement)list);
128            
129        } else {
130            for (Object o : list) {
131                if (o == null)  continue;
132                if (o instanceof GeomElement)
133                    invoke(env,callstack, (GeomElement)o);
134                else if (o instanceof ControlPoint)
135                    invoke(env,callstack, (ControlPoint)o);
136                else if (o instanceof ControlPointNet)
137                    invoke(env,callstack, (ControlPointNet)o);
138                else if (o instanceof List)
139                    invoke(env,callstack, (List)o);
140            }
141        }
142    }
143    
144}
145