~seh999/jcog/proto3

« back to all changes in this revision

Viewing changes to spacetime/tutorial/opencog/spacetime/tutorial/misc/JLinkExample.java

  • Committer: SeH
  • Date: 2009-09-19 22:59:48 UTC
  • Revision ID: seh999@gmail.com-20090919225948-q3ab80xa57i74mm6
start of major jReality refactoring

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package opencog.spacetime.tutorial.misc;
 
2
 
 
3
import static opencog.spacetime.shader.CommonAttributes.BACKGROUND_COLOR;
 
4
import static opencog.spacetime.shader.CommonAttributes.BACKGROUND_COLORS;
 
5
 
 
6
import java.awt.Color;
 
7
import java.awt.Component;
 
8
import java.awt.Dimension;
 
9
import java.awt.event.ActionEvent;
 
10
import java.awt.event.ActionListener;
 
11
import java.text.Format;
 
12
 
 
13
import javax.swing.BorderFactory;
 
14
import javax.swing.Box;
 
15
import javax.swing.JComboBox;
 
16
import javax.swing.JPanel;
 
17
import javax.swing.SwingConstants;
 
18
import javax.swing.border.CompoundBorder;
 
19
import javax.swing.border.EmptyBorder;
 
20
 
 
21
import opencog.spacetime.geometry.FrameFieldType;
 
22
import opencog.spacetime.geometry.QuadMeshFactory;
 
23
import opencog.spacetime.shader.CommonAttributes;
 
24
import opencog.spacetime.shader.DefaultGeometryShader;
 
25
import opencog.spacetime.shader.DefaultLineShader;
 
26
import opencog.spacetime.shader.DefaultPointShader;
 
27
import opencog.spacetime.shader.DefaultPolygonShader;
 
28
import opencog.spacetime.shader.ShaderUtility;
 
29
import opencog.spacetime.space.Appearance;
 
30
import opencog.spacetime.space.SpaceComponent;
 
31
import opencog.spacetime.swing.ui.viewerapp.ViewerApp;
 
32
import opencog.spacetime.tutorial.util.TextSlider;
 
33
import opencog.spacetime.util.CameraUtility;
 
34
import opencog.spacetime.util.SceneGraphUtility;
 
35
 
 
36
import com.wolfram.jlink.*;
 
37
 
 
38
 
 
39
public class JLinkExample {
 
40
 
 
41
        static double r = .4, R = 1.0;
 
42
        static int n = 20, m = 40;
 
43
        static QuadMeshFactory qmf;
 
44
    static KernelLink ml = null;
 
45
    static String workspace = "/Users/gunn/Software/workspace/";
 
46
        static String mmaFile = "jreality/src-tutorial/de/jreality/tutorial/misc/torus.m";
 
47
        static String mmaKernel = "/Applications/Mathematica 5.0.app/Contents/MacOS/MathKernel";
 
48
    public static void main(String[] argv) {
 
49
        // following shows the arguments needed on my machine: adapt 
 
50
        // location of mathematica for your system
 
51
        if (argv == null || argv.length == 0)   {
 
52
                argv = new String[]{
 
53
                "-linkmode",
 
54
                "launch",
 
55
                "-linkname",
 
56
                "\""+mmaKernel+"\""+" -mathlink "       };
 
57
        }
 
58
        System.err.println("argv = ");
 
59
        for (int i = 0; i<argv.length; ++i)     {
 
60
                System.err.println(argv[i]);
 
61
        }
 
62
        try {
 
63
            ml = MathLinkFactory.createKernelLink(argv);
 
64
            // Get rid of the initial InputNamePacket the kernel will send
 
65
            // when it is launched.
 
66
            ml.discardAnswer();
 
67
        } catch (MathLinkException e) {
 
68
            System.out.println("Fatal error opening link: " + e.getMessage());
 
69
            return;
 
70
        }
 
71
        JLinkExample tjl = new JLinkExample();
 
72
        tjl.doIt();
 
73
    }
 
74
    
 
75
    public void doIt() {
 
76
 
 
77
                // now connect to mathematica
 
78
                try {
 
79
                // first, some simple examples
 
80
                        ml.evaluate("2+2");
 
81
                        ml.waitForAnswer();
 
82
 
 
83
                        int result = ml.getInteger();
 
84
                        System.out.println("2 + 2 = " + result);
 
85
 
 
86
                        // Here's how to send the same input, but not as a string:
 
87
                        ml.putFunction("EvaluatePacket", 1);
 
88
                        ml.putFunction("Plus", 2);
 
89
                        ml.put(3);
 
90
                        ml.put(3);
 
91
                        ml.endPacket();
 
92
                        ml.waitForAnswer();
 
93
                        result = ml.getInteger();
 
94
                        System.out.println("3 + 3 = " + result);
 
95
 
 
96
                        // If you want the result back as a string, use evaluateToInputForm
 
97
                        // or evaluateToOutputForm. The second arg for either is the
 
98
                        // requested page width for formatting the string. Pass 0 for
 
99
                        // PageWidth->Infinity. These methods get the result in one
 
100
                        // step--no need to call waitForAnswer.
 
101
                        String strResult = ml.evaluateToOutputForm("4+4", 0);
 
102
                        System.out.println("4 + 4 = " + strResult);
 
103
 
 
104
                        // read in a mathematica package which contains the definition of a torus
 
105
            ml.evaluate("<<"+workspace+mmaFile); // "<<MyPackage.m");
 
106
                        ml.discardAnswer();
 
107
 
 
108
                        // the interesting part!
 
109
                        updateTorusFromMma();
 
110
 
 
111
                        SpaceComponent torussgc = SceneGraphUtility
 
112
                                        .createFullSceneGraphComponent("torus knot");
 
113
                        setupAppearance(torussgc.getAppearance());
 
114
                        torussgc.setGeometry(qmf.getIndexedFaceSet());
 
115
                        ViewerApp va = ViewerApp.display(torussgc);
 
116
                        CameraUtility.encompass(va.getViewer());
 
117
                        Appearance rootAp = va.getCurrentViewer().getSceneRoot().getAppearance();
 
118
                        rootAp.setAttribute(BACKGROUND_COLORS, Appearance.INHERITED);
 
119
                        rootAp.setAttribute(BACKGROUND_COLOR, new Color(0,20,40));
 
120
                        
 
121
                        Component insp = getInspector();
 
122
                        va.addAccessory(insp);
 
123
                        va.setFirstAccessory(insp);
 
124
                        va.setAttachNavigator(true);
 
125
                        va.update();
 
126
                        va.getFrame().setName("M'ma JLink tutorial");
 
127
 
 
128
        } catch (MathLinkException e) {
 
129
            System.out.println("MathLinkException occurred: " + e.getMessage());
 
130
        } 
 
131
    }
 
132
 
 
133
        private void updateTorusFromMma(){
 
134
                if (qmf == null)        {
 
135
                // set up the quad mesh factory
 
136
                        qmf = new QuadMeshFactory();
 
137
                        qmf.setClosedInUDirection(true);
 
138
                        qmf.setClosedInVDirection(true);
 
139
                        qmf.setGenerateEdgesFromFaces(true);
 
140
                        qmf.setGenerateFaceNormals(true);
 
141
                        qmf.setGenerateFaceNormals(true);
 
142
                }
 
143
                // write the expression we want to express using the format() method
 
144
                String command = String.format("torus[%g, %g, %d, %d]", r, R, m, n);
 
145
                System.err.println("command = "+command);
 
146
                try {
 
147
                        ml.evaluate(command);
 
148
                        ml.waitForAnswer();
 
149
 
 
150
                        Expr expr = ml.getExpr();
 
151
                        int[] dimn = expr.dimensions();
 
152
                        if (dimn.length != 3)
 
153
                                throw new IllegalStateException("wrong dimensions");
 
154
                        int[] part = { 0, 0, 0 };
 
155
                        // build up the quad mesh from the returned expression
 
156
                        double[][][] mesh = new double[dimn[0]][dimn[1]][dimn[2]];
 
157
                        for (int i = 0; i < dimn[0]; ++i) {
 
158
                                part[0] = i + 1;
 
159
                                for (int j = 0; j < dimn[1]; ++j) {
 
160
                                        part[1] = j + 1;
 
161
                                        for (int k = 0; k < dimn[2]; ++k) {
 
162
                                                part[2] = k + 1;
 
163
                                                mesh[i][j][k] = expr.part(part).asDouble();
 
164
                                        }
 
165
                                }
 
166
                        }
 
167
                        qmf.setVLineCount(dimn[0]);
 
168
                        qmf.setULineCount(dimn[1]);
 
169
                        qmf.setVertexCoordinates(mesh);
 
170
                        qmf.update();
 
171
                } catch (MathLinkException e) {
 
172
                        e.printStackTrace();
 
173
                } catch (ExprFormatException e) {
 
174
                        e.printStackTrace();
 
175
                }
 
176
        }
 
177
        
 
178
        private  Component getInspector() {
 
179
                Box container = Box.createVerticalBox();
 
180
                container.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5),
 
181
                                BorderFactory.createTitledBorder(BorderFactory
 
182
                                                .createEtchedBorder(), "Torus parameters")));
 
183
 
 
184
                final TextSlider.Double RSlider = new TextSlider.Double("R",
 
185
                                SwingConstants.HORIZONTAL, 0.0, 2, R);
 
186
                RSlider.addActionListener(new ActionListener() {
 
187
                        public void actionPerformed(ActionEvent e) {
 
188
                                R = RSlider.getValue();
 
189
                                updateTorusFromMma();
 
190
                        }
 
191
                });
 
192
                container.add(RSlider);
 
193
                
 
194
                final TextSlider.Double rSlider = new TextSlider.Double("r",
 
195
                                SwingConstants.HORIZONTAL, 0.0, 1, r);
 
196
                rSlider.addActionListener(new ActionListener() {
 
197
                        public void actionPerformed(ActionEvent e) {
 
198
                                r = rSlider.getValue();
 
199
                                updateTorusFromMma();
 
200
                        }
 
201
                });
 
202
                container.add(rSlider);
 
203
                
 
204
                final TextSlider rtSlider = new TextSlider.Integer("u count",
 
205
                                SwingConstants.HORIZONTAL, 2, 100, n);
 
206
                rtSlider.addActionListener(new ActionListener() {
 
207
                        public void actionPerformed(ActionEvent e) {
 
208
                                n = rtSlider.getValue().intValue();
 
209
                                updateTorusFromMma();
 
210
                        }
 
211
                });
 
212
                container.add(rtSlider);
 
213
 
 
214
                final TextSlider mSlider = new TextSlider.Integer("v count",
 
215
                                SwingConstants.HORIZONTAL, 2, 100, m);
 
216
                mSlider.addActionListener(new ActionListener() {
 
217
                        public void actionPerformed(ActionEvent e) {
 
218
                                m = mSlider.getValue().intValue();
 
219
                                updateTorusFromMma();
 
220
                        }
 
221
                });
 
222
                container.add(mSlider);
 
223
 
 
224
 
 
225
                container.setPreferredSize(new Dimension(300, 180));
 
226
                JPanel panel = new JPanel();
 
227
                panel.setName("Parameters");
 
228
                panel.add(container);
 
229
                panel.add(Box.createVerticalGlue());
 
230
                return panel;
 
231
        }
 
232
 
 
233
        private static void setupAppearance(Appearance ap) {
 
234
                DefaultGeometryShader dgs;
 
235
                DefaultLineShader dls;
 
236
                DefaultPointShader dpts;
 
237
                dgs = ShaderUtility.createDefaultGeometryShader(ap, true);
 
238
                dls = (DefaultLineShader) dgs.createLineShader("default");
 
239
                dls.setDiffuseColor(Color.yellow);
 
240
                dls.setTubeRadius(.015);
 
241
                dpts = (DefaultPointShader) dgs.createPointShader("default");
 
242
                dpts.setDiffuseColor(Color.red);
 
243
                dpts.setPointRadius(.03);
 
244
        }
 
245
 
 
246
}
 
 
b'\\ No newline at end of file'