Rewrite graph system, add commands, add special keywords to shell (ans, clc)

master
skylarmt 9 years ago
parent 3174ab585b
commit 193bf13349

Binary file not shown.

@ -35,6 +35,7 @@ file.reference.autocomplete-2.5.4.jar=lib/autocomplete-2.5.4.jar
file.reference.htmlcleaner-2.10.jar=lib/htmlcleaner-2.10.jar
file.reference.iText-4.2.0-com.itextpdf.jar=lib/iText-4.2.0-com.itextpdf.jar
file.reference.JavaPrettify-1.2.1.jar=lib/JavaPrettify-1.2.1.jar
file.reference.jmathplot.jar=lib/jmathplot.jar
file.reference.js-engine.jar=lib/js-engine.jar
file.reference.js.jar=lib/js.jar
file.reference.jython-standalone-2.7-b3.jar=lib/jython-standalone-2.7-b3.jar
@ -55,7 +56,8 @@ javac.classpath=\
${file.reference.js.jar}:\
${file.reference.jython-standalone-2.7-b3.jar}:\
${file.reference.rsyntaxtextarea-2.5.6.jar}:\
${file.reference.autocomplete-2.5.4.jar}
${file.reference.autocomplete-2.5.4.jar}:\
${file.reference.jmathplot.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false

@ -122,15 +122,29 @@ public class Functions {
/*
Graphing interfaces
*/
public void plotrange(double xmin, double xmax) {
graphwin.setRange(xmin, xmax);
}
public void plot(String function) {
showGraph();
graphwin.graphFunction(function);
}
public void plot(String function, double xmin, double xmax) {
graphwin.setRange(xmin, xmax);
plot(function);
}
public void ezplot(String f) {
plot(f);
}
public void ezplot(String function, double xmin, double xmax) {
plot(function, xmin, xmax);
}
public void graph(String f) {
plot(f);
}
@ -159,11 +173,6 @@ public class Functions {
plotclr();
}
public void plotscale(int level) {
showGraph();
graphwin.setZoom(level);
}
public void drawdot(double x, double y) {
showGraph();
graphwin.drawDot(x, y);

@ -9,7 +9,7 @@
<Property name="text" type="java.lang.String" value="File"/>
</Properties>
<SubComponents>
<MenuItem class="javax.swing.JMenuItem" name="jMenuItem2">
<MenuItem class="javax.swing.JMenuItem" name="exportBtn">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="Ctrl+S"/>
@ -17,7 +17,7 @@
<Property name="text" type="java.lang.String" value="Export graph..."/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem2ActionPerformed"/>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exportBtnActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
@ -38,15 +38,7 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clrGraphBtnActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="jMenuItem6">
<Properties>
<Property name="text" type="java.lang.String" value="Scale..."/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem6ActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="jMenuItem3">
<MenuItem class="javax.swing.JMenuItem" name="setTitleBtn">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="Ctrl+T"/>
@ -54,20 +46,11 @@
<Property name="text" type="java.lang.String" value="Set Title..."/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem3ActionPerformed"/>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="setTitleBtnActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Menu>
<Menu class="javax.swing.JMenu" name="scaleLbl">
<Properties>
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="0" id="blue" palette="1" red="0" type="palette"/>
</Property>
<Property name="text" type="java.lang.String" value="Scale: 1 to 1"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Menu>
</SubComponents>
</Menu>
</NonVisualComponents>
@ -75,17 +58,13 @@
<Property name="closable" type="boolean" value="true"/>
<Property name="defaultCloseOperation" type="int" value="1"/>
<Property name="iconifiable" type="boolean" value="true"/>
<Property name="maximizable" type="boolean" value="true"/>
<Property name="resizable" type="boolean" value="true"/>
<Property name="title" type="java.lang.String" value="Graph"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="frameIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/net/apocalypselabs/symat/icons/graph.png"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[326, 402]"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[326, 402]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[326, 402]"/>
</Property>
@ -112,27 +91,22 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="inBox" min="-2" pref="215" max="-2" attributes="0"/>
<Component id="inBox" pref="215" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="plotBtn" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
</Group>
<Component id="gLbl" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
</Group>
<Component id="plot" alignment="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="gLbl" min="-2" max="-2" attributes="0"/>
<Component id="plot" pref="311" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="inBox" alignment="3" min="-2" max="-2" attributes="0"/>
@ -164,26 +138,7 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="plotBtnActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="gLbl">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="&quot;&quot;" type="code"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[300, 300]"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[300, 300]"/>
</Property>
<Property name="opaque" type="boolean" value="true"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[300, 300]"/>
</Property>
</Properties>
<Component class="org.math.plot.Plot2DPanel" name="plot">
</Component>
</SubComponents>
</Form>

@ -41,6 +41,7 @@ import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.math.plot.Plot2DPanel;
import org.matheclipse.core.eval.EvalUtilities;
import org.matheclipse.parser.client.math.MathException;
@ -51,8 +52,7 @@ import org.matheclipse.parser.client.math.MathException;
public class Graph extends javax.swing.JInternalFrame {
private final JFileChooser fc = new JFileChooser();
private BufferedImage gpnl;
private Graphics gg; // Main graphics object
private boolean standalone = true;
private boolean customName = false;
@ -62,13 +62,9 @@ public class Graph extends javax.swing.JInternalFrame {
// If a graph is being drawn, set to true, else false
boolean graphing = false;
// Graph scaling data.
private double xtimes = 15;
private double ytimes = 15;
private double scale = 1;
// The current value for the zoom/scale, as entered by the user
private int scaleLevel = 0;
// Graph min and max
private double xmin = -10;
private double xmax = 10;
/**
* Creates new form Graph
@ -84,12 +80,12 @@ public class Graph extends javax.swing.JInternalFrame {
private void init() {
initComponents();
gpnl = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
FileFilter filter = new FileNameExtensionFilter("PNG image (.png)", "png");
fc.setFileFilter(filter);
fc.addChoosableFileFilter(filter);
filter = new FileNameExtensionFilter("JPEG image (.jpg)", "jpg");
fc.addChoosableFileFilter(filter);
plot.plotToolBar.remove(5);
plot.plotToolBar.remove(4);
plot.plotToolBar.remove(3);
}
@Override
@ -117,24 +113,22 @@ public class Graph extends javax.swing.JInternalFrame {
inBox = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
plotBtn = new javax.swing.JButton();
gLbl = new javax.swing.JLabel();
plot = new org.math.plot.Plot2DPanel();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem2 = new javax.swing.JMenuItem();
exportBtn = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
clrGraphBtn = new javax.swing.JMenuItem();
jMenuItem6 = new javax.swing.JMenuItem();
jMenuItem3 = new javax.swing.JMenuItem();
scaleLbl = new javax.swing.JMenu();
setTitleBtn = new javax.swing.JMenuItem();
setClosable(true);
setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
setIconifiable(true);
setMaximizable(true);
setResizable(true);
setTitle("Graph");
setToolTipText("");
setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/graph.png"))); // NOI18N
setMaximumSize(new java.awt.Dimension(326, 402));
setMinimumSize(new java.awt.Dimension(326, 402));
setPreferredSize(new java.awt.Dimension(326, 402));
addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentShown(java.awt.event.ComponentEvent evt) {
@ -158,24 +152,16 @@ public class Graph extends javax.swing.JInternalFrame {
}
});
gLbl.setBackground(new java.awt.Color(255, 255, 255));
gLbl.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
gLbl.setToolTipText("");
gLbl.setMaximumSize(new java.awt.Dimension(300, 300));
gLbl.setMinimumSize(new java.awt.Dimension(300, 300));
gLbl.setOpaque(true);
gLbl.setPreferredSize(new java.awt.Dimension(300, 300));
jMenu1.setText("File");
jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem2.setText("Export graph...");
jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
exportBtn.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
exportBtn.setText("Export graph...");
exportBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem2ActionPerformed(evt);
exportBtnActionPerformed(evt);
}
});
jMenu1.add(jMenuItem2);
jMenu1.add(exportBtn);
jMenuBar1.add(jMenu1);
@ -190,30 +176,17 @@ public class Graph extends javax.swing.JInternalFrame {
});
jMenu2.add(clrGraphBtn);
jMenuItem6.setText("Scale...");
jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
setTitleBtn.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
setTitleBtn.setText("Set Title...");
setTitleBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem6ActionPerformed(evt);
setTitleBtnActionPerformed(evt);
}
});
jMenu2.add(jMenuItem6);
jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem3.setText("Set Title...");
jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem3ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem3);
jMenu2.add(setTitleBtn);
jMenuBar1.add(jMenu2);
scaleLbl.setForeground(java.awt.Color.blue);
scaleLbl.setText("Scale: 1 to 1");
scaleLbl.setEnabled(false);
jMenuBar1.add(scaleLbl);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
@ -222,21 +195,18 @@ public class Graph extends javax.swing.JInternalFrame {
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(inBox, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(inBox, javax.swing.GroupLayout.DEFAULT_SIZE, 215, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(plotBtn))
.addComponent(gLbl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, 0))
.addComponent(plotBtn)
.addGap(10, 10, 10))
.addComponent(plot, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(gLbl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(plot, javax.swing.GroupLayout.DEFAULT_SIZE, 311, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(inBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
@ -281,44 +251,61 @@ public class Graph extends javax.swing.JInternalFrame {
}
});
for (String formula : frmlas) {
String niceformula = formula;
CodeRunner cr = new CodeRunner();
formula = formula.replaceAll("x", "\\$x");
EvalUtilities solver = new EvalUtilities();
double xx, yy, xo, yo, x;
xo = 0;
yo = 0;
gg = gpnl.getGraphics();
drawAxes();
gg.setColor(Color.BLUE);
for (x = (-10 * scale); x <= (10 * scale); x += (10 * scale * .01)) {
String xx = "";
String yy = "";
double x;
for (x = xmin; x <= xmax; x += ((xmax - xmin) / 40.0)) {
try {
cr.setVar("x", x);
yy = (-(Double.parseDouble(solver.evaluate("$x=" + x + ";N[" + formula + "]").toString())) * ytimes) + (gpnl.getHeight() / 2);
//System.err.println(solver.evaluate("$x="+x+";N["+formula+"]").toString());
xx = (x * xtimes) + (gpnl.getWidth() / 2);
//gg.drawOval(xx-1, yy-1, 2, 2);
if (x != (-10 * scale)) {
gg.drawLine((int) xo, (int) yo, (int) xx, (int) yy);
}
xo = xx;
yo = yy;
yy += solver.evaluate("$x=" + x + ";N[" + formula + "]").toString() + " ";
xx += String.valueOf(x) + " ";
} catch (MathException | NumberFormatException ex) {
}
}
gg.translate(gpnl.getWidth() / 2, gpnl.getHeight() / 2);
SwingUtilities.invokeLater(new Runnable() {
Debug.println(xx);
Debug.println(yy);
String[] xs = xx.trim().split(" ");
String[] ys = yy.trim().split(" ");
double[] xd = new double[xs.length];
double[] yd = new double[ys.length];
for (int i = 0; i < xs.length; i++) {
xd[i] = Double.parseDouble(xs[i]);
}
for (int i = 0; i < ys.length; i++) {
yd[i] = Double.parseDouble(ys[i]);
}
SwingUtilities.invokeLater(new Updater(niceformula, xd, yd));
}
SwingUtilities.invokeLater(new Finisher());
}
private class Updater implements Runnable {
final double[] xd;
final double[] yd;
final String formula;
public Updater(String frmla, double[] x, double[] y) {
xd = x;
yd = y;
formula = frmla;
}
@Override
public void run() {
dispGraph();
if (!customName) {
setTitle("Graph | " + inBox.getText());
}
history += inBox.getText() + "\n";
plot.addLinePlot(formula, xd, yd);
history += formula + "\n";
}
});
}
SwingUtilities.invokeLater(new Runnable() {
private class Finisher implements Runnable {
@Override
public void run() {
inBox.setEnabled(true);
@ -327,15 +314,11 @@ public class Graph extends javax.swing.JInternalFrame {
mu.setEnabled(true);
}
}
});
}
}
private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown
gg = gpnl.getGraphics();
drawAxes();
gg.translate(gpnl.getWidth() / 2, gpnl.getHeight() / 2);
dispGraph();
}//GEN-LAST:event_formComponentShown
/**
@ -354,46 +337,8 @@ public class Graph extends javax.swing.JInternalFrame {
return gscale;
}
/**
* Set the zoom level. The larger the int, the more zoomed it is.
*
* @param zoomLevel Level to zoom. 0 is default (10x10).
*/
public void setZoom(int zoomLevel) {
scaleLevel = zoomLevel;
if (zoomLevel >= 0) {
xtimes = 15.0 * (zoomLevel + 1.0);
ytimes = 15.0 * (zoomLevel + 1.0);
} else {
xtimes = 15.0 / (abs(zoomLevel) + 1.0);
ytimes = 15.0 / (abs(zoomLevel) + 1.0);
}
scale = getScale(zoomLevel);
scaleLbl.setText("Scale: 1 to " + scale);
Debug.println("Scaled to xtimes=" + xtimes + ", ytimes=" + ytimes + ", scale=1to" + scale);
clearDraw(false);
if (!history.trim().equals("")) {
String temp = "";
for (String cmd : history.trim().split("\n")) {
cmd = cmd.trim();
if (!cmd.equals("")) {
temp += cmd + "\n";
}
}
history = temp.trim();
new GraphThread(history.split("\n")).start();
inBox.setText("");
}
}
private void dispGraph() {
gLbl.setIcon(new ImageIcon(gpnl));
}
public void drawDot(double x, double y) {
gg.setColor(Color.RED);
gg.drawOval((int) (x * xtimes - 2), (int) (y * -ytimes - 2), 4, 4);
dispGraph();
// TODO: implement this
}
private void inBoxKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inBoxKeyTyped
@ -406,23 +351,11 @@ public class Graph extends javax.swing.JInternalFrame {
clearDraw();
}//GEN-LAST:event_clrGraphBtnActionPerformed
private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
int r = fc.showSaveDialog(this);
if (r == JFileChooser.APPROVE_OPTION) {
try {
File file = new File(addSaveExt(fc.getSelectedFile().toString()));
if (file.toString().endsWith("png")) {
ImageIO.write(gpnl, "png", file);
} else if (file.toString().endsWith("jpg")) {
ImageIO.write(gpnl, "jpg", file);
}
} catch (IOException ex) {
JOptionPane.showInternalMessageDialog(this, "Error: Cannot save file: " + ex.getMessage());
}
}
}//GEN-LAST:event_jMenuItem2ActionPerformed
private void exportBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportBtnActionPerformed
}//GEN-LAST:event_exportBtnActionPerformed
private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
private void setTitleBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_setTitleBtnActionPerformed
String wintitle = JOptionPane.showInternalInputDialog(this,
"New window title:",
"Rename",
@ -430,22 +363,36 @@ public class Graph extends javax.swing.JInternalFrame {
if (wintitle != null && !wintitle.equals("")) {
setWindowTitle(wintitle);
}
}//GEN-LAST:event_jMenuItem3ActionPerformed
}//GEN-LAST:event_setTitleBtnActionPerformed
/**
* Get the range of the graph.
*
* @return {xmin, xmax}
*/
public double[] getRange() {
double[] range = {xmin, xmax};
return range;
}
public void setRange(double min, double max) {
xmin = min;
xmax = max;
private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
GraphScale gs = new GraphScale(scaleLevel);
int size = 0;
int result = JOptionPane.showInternalConfirmDialog(this,
gs,
"Graph Scale",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
size = gs.getScale();
Debug.println("Scaling to: " + size);
setZoom(size);
clearDraw(false);
if (!history.trim().equals("")) {
String temp = "";
for (String cmd : history.trim().split("\n")) {
cmd = cmd.trim();
if (!cmd.equals("")) {
temp += cmd + "\n";
}
}
history = temp.trim();
new GraphThread(history.split("\n")).start();
inBox.setText("");
}
}
}//GEN-LAST:event_jMenuItem6ActionPerformed
/**
* Graph the given function. Same as typing into input box and pressing
@ -459,7 +406,7 @@ public class Graph extends javax.swing.JInternalFrame {
}
private String addSaveExt(String path) {
if (!path.matches(".*\\.(png|jpg)")) {
if (!path.matches(".*\\.(png)")) {
path += ".png";
}
return path;
@ -497,41 +444,22 @@ public class Graph extends javax.swing.JInternalFrame {
* @param alsoHistory True if history should be removed
*/
public void clearDraw(boolean alsoHistory) {
gpnl = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
gg = gpnl.getGraphics();
drawAxes();
gg.translate(gpnl.getWidth() / 2, gpnl.getHeight() / 2);
dispGraph();
setTitle("Graph");
if (alsoHistory) {
history = "";
}
}
private void drawAxes() {
gg.setColor(Color.GRAY);
gg.drawLine(150, 0, 150, 300);
gg.drawLine(0, 150, 300, 150);
// Draw points
for (int i = 0; i <= 315; i += 15) {
gg.drawOval(150 - 1, i - 1, 2, 2);
gg.drawOval(i - 1, 150 - 1, 2, 2);
}
gg.setColor(Color.BLUE);
plot.removeAllPlots();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem clrGraphBtn;
private javax.swing.JLabel gLbl;
private javax.swing.JMenuItem exportBtn;
private javax.swing.JTextField inBox;
private javax.swing.JLabel jLabel1;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem6;
private org.math.plot.Plot2DPanel plot;
private javax.swing.JButton plotBtn;
private javax.swing.JMenu scaleLbl;
private javax.swing.JMenuItem setTitleBtn;
// End of variables declaration//GEN-END:variables
}

@ -44,6 +44,7 @@ public class Interpreter extends javax.swing.JInternalFrame {
private String[] history = new String[10]; // Command history buffer
private int historyIndex = 0; // For going back in time and keeping things straight
private String lang = "javascript";
private Object ans = 0;
/**
* Creates new form Interpreter
@ -362,11 +363,39 @@ public class Interpreter extends javax.swing.JInternalFrame {
code = cmd;
}
/**
* Process control commands.
*
* @return True if the modified code should be executed, false if not.
*/
private boolean doSpecialCommands() {
switch (code) {
case "clc":
clrOutput();
return false;
}
// Implement ans command
String ansfill = "";
try {
ansfill = String.valueOf(Double.parseDouble(ans.toString()));
} catch (NumberFormatException ex) {
ansfill = "\"" + ans.toString() + "\"";
}
code = code.replace("ans", ansfill);
return true;
}
@Override
public void run() {
try {
append(cr.evalString(code).toString() + "\n");
if (doSpecialCommands()) {
Object result = cr.evalString(code);
if (result != null && !result.toString().trim().equals("")) {
ans = result;
}
append(result.toString() + "\n");
}
} catch (NullPointerException ex) {
}
@ -388,12 +417,22 @@ public class Interpreter extends javax.swing.JInternalFrame {
});
}
private void clrOutput() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
mainBox.setText("");
}
});
}
private void append(String out) {
final String output = out;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
mainBox.append(output);
mainBox.setCaretPosition(mainBox.getText().length());
}
});
}

@ -49,9 +49,9 @@ import javax.swing.JInternalFrame;
*/
public class MainGUI extends javax.swing.JFrame {
// TODO: Add more code comments and stuff in case anybody else reads this
public static final String APP_NAME = "SyMAT 0.9.1";
public static final double APP_CODE = 11;
public static final String VERSION_NAME = "0.9.1";
public static final String APP_NAME = "SyMAT 1.0";
public static final double APP_CODE = 12;
public static final String VERSION_NAME = "1.0";
public static final String API_URL = "https://apis.symatapp.com/";
public static String argfile = "";
public static boolean skipPython = false; // Skip python init on start?

@ -110,6 +110,37 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
<br>
<p><b>JMathPlot</b></p><br>
<p>Copyright (c) 2009, µ-Labs
All rights reserved.<br><br>
Redistribution and use in source and binary forms,
with or without modification, are permitted provided that the
following conditions are met:</p>
<ol>
<li>Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.</li>
<li>Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials
provided with the distribution.</li>
<li>Neither the name of the copyright holder nor the names of
its contributors may be used to endorse or promote products
derived from this software without specific prior written
permission.</li>
</ol><p>
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.</p>
<p><b>HtmlCleaner</b></p><br>
<p>Copyright (c) 2006-2014, HtmlCleaner team.<br>
All rights reserved.<br>

Loading…
Cancel
Save