1
package opencog.spacetime.tutorial.misc;
3
import static opencog.spacetime.shader.CommonAttributes.BACKGROUND_COLOR;
4
import static opencog.spacetime.shader.CommonAttributes.BACKGROUND_COLORS;
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;
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;
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;
36
import com.wolfram.jlink.*;
39
public class JLinkExample {
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) {
56
"\""+mmaKernel+"\""+" -mathlink " };
58
System.err.println("argv = ");
59
for (int i = 0; i<argv.length; ++i) {
60
System.err.println(argv[i]);
63
ml = MathLinkFactory.createKernelLink(argv);
64
// Get rid of the initial InputNamePacket the kernel will send
65
// when it is launched.
67
} catch (MathLinkException e) {
68
System.out.println("Fatal error opening link: " + e.getMessage());
71
JLinkExample tjl = new JLinkExample();
77
// now connect to mathematica
79
// first, some simple examples
83
int result = ml.getInteger();
84
System.out.println("2 + 2 = " + result);
86
// Here's how to send the same input, but not as a string:
87
ml.putFunction("EvaluatePacket", 1);
88
ml.putFunction("Plus", 2);
93
result = ml.getInteger();
94
System.out.println("3 + 3 = " + result);
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);
104
// read in a mathematica package which contains the definition of a torus
105
ml.evaluate("<<"+workspace+mmaFile); // "<<MyPackage.m");
108
// the interesting part!
109
updateTorusFromMma();
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));
121
Component insp = getInspector();
122
va.addAccessory(insp);
123
va.setFirstAccessory(insp);
124
va.setAttachNavigator(true);
126
va.getFrame().setName("M'ma JLink tutorial");
128
} catch (MathLinkException e) {
129
System.out.println("MathLinkException occurred: " + e.getMessage());
133
private void updateTorusFromMma(){
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);
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);
147
ml.evaluate(command);
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) {
159
for (int j = 0; j < dimn[1]; ++j) {
161
for (int k = 0; k < dimn[2]; ++k) {
163
mesh[i][j][k] = expr.part(part).asDouble();
167
qmf.setVLineCount(dimn[0]);
168
qmf.setULineCount(dimn[1]);
169
qmf.setVertexCoordinates(mesh);
171
} catch (MathLinkException e) {
173
} catch (ExprFormatException e) {
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")));
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();
192
container.add(RSlider);
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();
202
container.add(rSlider);
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();
212
container.add(rtSlider);
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();
222
container.add(mSlider);
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());
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);
b'\\ No newline at end of file'