From: Bill Kuker Date: Sun, 9 Aug 2009 22:15:23 +0000 (+0000) Subject: Added validating and some validation X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=725c3b304a1e6405589e1fb6e84a69c68605b8bd;p=sw%2Fmotorsim Added validating and some validation fixed moon burner offset --- diff --git a/src/com/billkuker/rocketry/motorsim/Burn.java b/src/com/billkuker/rocketry/motorsim/Burn.java index ef2474b..6be9861 100644 --- a/src/com/billkuker/rocketry/motorsim/Burn.java +++ b/src/com/billkuker/rocketry/motorsim/Burn.java @@ -25,6 +25,8 @@ import org.apache.log4j.Logger; import org.jscience.physics.amount.Amount; import org.jscience.physics.amount.Constants; +import com.billkuker.rocketry.motorsim.Validating.ValidationException; + public class Burn { //Some constants to tune adaptive regression step private static final double regStepIncreaseFactor = 1.01; @@ -70,11 +72,21 @@ public class Burn { } public Burn(Motor m){ + try { + m.validate(); + } catch (ValidationException e) { + throw new IllegalArgumentException("Invalid Motor: " + e.getMessage()); + } motor = m; burn(); } public Burn(Motor m, BurnProgressListener bpl){ + try { + m.validate(); + } catch (ValidationException e) { + throw new IllegalArgumentException("Invalid Motor: " + e.getMessage()); + } motor = m; this.bpl = bpl; burn(); diff --git a/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java b/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java index 1610031..2f10cb9 100644 --- a/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java +++ b/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java @@ -14,7 +14,7 @@ import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; -public class ConvergentDivergentNozzle implements Nozzle { +public class ConvergentDivergentNozzle implements Nozzle, Validating { private Amount throatDiameter; @@ -38,8 +38,6 @@ public class ConvergentDivergentNozzle implements Nozzle { public void setThroatDiameter(Amount throatDiameter) { - if ( exitDiameter != null && throatDiameter.isGreaterThan(exitDiameter)) - throw new IllegalArgumentException("Throat > Exit"); this.throatDiameter = throatDiameter; } @@ -50,8 +48,6 @@ public class ConvergentDivergentNozzle implements Nozzle { public void setExitDiameter(Amount exitDiameter) { - if ( throatDiameter != null && exitDiameter.isLessThan(throatDiameter)) - throw new IllegalArgumentException("Throat > Exit"); this.exitDiameter = exitDiameter; } @@ -112,4 +108,10 @@ public class ConvergentDivergentNozzle implements Nozzle { return s; } + + @Override + public void validate() throws ValidationException { + if ( exitDiameter != null && throatDiameter.isGreaterThan(exitDiameter)) + throw new IllegalArgumentException("Throat > Exit"); + } } diff --git a/src/com/billkuker/rocketry/motorsim/Motor.java b/src/com/billkuker/rocketry/motorsim/Motor.java index 2671351..91c2c10 100644 --- a/src/com/billkuker/rocketry/motorsim/Motor.java +++ b/src/com/billkuker/rocketry/motorsim/Motor.java @@ -1,12 +1,30 @@ package com.billkuker.rocketry.motorsim; -public class Motor { +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; +import com.billkuker.rocketry.motorsim.Validating.ValidationException; + +public class Motor implements Validating{ private Chamber chamber; private Grain grain; private Nozzle nozzle; private Fuel fuel; private String name; + public void validate() throws ValidationException { + if ( chamber.chamberVolume().isLessThan(grain.volume(Amount.valueOf(0, SI.MILLIMETER)))){ + throw new ValidationException(this, "Fuel does not fit in chamber"); + } + if ( chamber instanceof Validating ) + ((Validating)chamber).validate(); + if ( grain instanceof Validating ) + ((Validating)grain).validate(); + if ( nozzle instanceof Validating ) + ((Validating)nozzle).validate(); + if ( fuel instanceof Validating ) + ((Validating)fuel).validate(); + } public Chamber getChamber() { return chamber; diff --git a/src/com/billkuker/rocketry/motorsim/Validating.java b/src/com/billkuker/rocketry/motorsim/Validating.java new file mode 100644 index 0000000..b020c63 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/Validating.java @@ -0,0 +1,12 @@ +package com.billkuker.rocketry.motorsim; + +public interface Validating { + + public class ValidationException extends Exception{ + public ValidationException(Validating part, String error){ + super(error); + } + } + + public void validate() throws ValidationException; +} diff --git a/src/com/billkuker/rocketry/motorsim/grain/CoredCylindricalGrain.java b/src/com/billkuker/rocketry/motorsim/grain/CoredCylindricalGrain.java index 6071d8a..5b05536 100644 --- a/src/com/billkuker/rocketry/motorsim/grain/CoredCylindricalGrain.java +++ b/src/com/billkuker/rocketry/motorsim/grain/CoredCylindricalGrain.java @@ -12,11 +12,12 @@ import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; +import com.billkuker.rocketry.motorsim.Validating; import com.billkuker.rocketry.motorsim.visual.Editor; import com.billkuker.rocketry.motorsim.visual.GrainPanel; -public class CoredCylindricalGrain extends ExtrudedGrain { +public class CoredCylindricalGrain extends ExtrudedGrain implements Validating { private Amount oD, iD; private boolean outerSurfaceInhibited = true, innerSurfaceInhibited = false; @@ -128,8 +129,8 @@ public class CoredCylindricalGrain extends ExtrudedGrain { iD = id; } - /* - public void checkValidity() throws ValidationException{ + @Override + public void validate() throws ValidationException{ if ( iD.equals(Amount.ZERO) ) throw new ValidationException(this, "Invalid iD"); if ( oD.equals(Amount.ZERO) ) @@ -143,7 +144,6 @@ public class CoredCylindricalGrain extends ExtrudedGrain { throw new ValidationException(this, "No exposed grain surface"); } - */ public Amount webThickness() { if ( innerSurfaceInhibited && outerSurfaceInhibited ){ diff --git a/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java b/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java index 1405562..3364e60 100644 --- a/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java +++ b/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java @@ -11,12 +11,14 @@ import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; +import com.billkuker.rocketry.motorsim.Validating; +import com.billkuker.rocketry.motorsim.Validating.ValidationException; import com.billkuker.rocketry.motorsim.grain.util.BurningShape; import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain; import com.billkuker.rocketry.motorsim.visual.Editor; import com.billkuker.rocketry.motorsim.visual.GrainPanel; -public class Finocyl extends ExtrudedShapeGrain { +public class Finocyl extends ExtrudedShapeGrain implements Validating { private Amount oD = Amount.valueOf(30, SI.MILLIMETER); private Amount iD = Amount.valueOf(10, SI.MILLIMETER); private Amount finWidth = Amount.valueOf(2, SI.MILLIMETER); @@ -113,4 +115,16 @@ public class Finocyl extends ExtrudedShapeGrain { new Editor(e).showAsWindow(); new GrainPanel(e).showAsWindow(); } + + @Override + public void validate() throws ValidationException{ + if ( iD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid iD"); + if ( oD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid oD"); + if ( getLength().equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid Length"); + if ( iD.isGreaterThan(oD) ) + throw new ValidationException(this, "iD > oD"); + } } diff --git a/src/com/billkuker/rocketry/motorsim/grain/Moonburner.java b/src/com/billkuker/rocketry/motorsim/grain/Moonburner.java index 5a56c95..9ffbec8 100644 --- a/src/com/billkuker/rocketry/motorsim/grain/Moonburner.java +++ b/src/com/billkuker/rocketry/motorsim/grain/Moonburner.java @@ -9,12 +9,14 @@ import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; +import com.billkuker.rocketry.motorsim.Validating; +import com.billkuker.rocketry.motorsim.Validating.ValidationException; import com.billkuker.rocketry.motorsim.grain.util.BurningShape; import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain; import com.billkuker.rocketry.motorsim.visual.Editor; import com.billkuker.rocketry.motorsim.visual.GrainPanel; -public class Moonburner extends ExtrudedShapeGrain { +public class Moonburner extends ExtrudedShapeGrain implements Validating { private Amount oD = Amount.valueOf(30, SI.MILLIMETER); private Amount iD = Amount.valueOf(10, SI.MILLIMETER); @@ -72,7 +74,7 @@ public class Moonburner extends ExtrudedShapeGrain { xsection.add(outside); xsection.inhibit(outside); - xsection.subtract(new Ellipse2D.Double(odmm/2 - idmm/2 + offmm, odmm/2 - idmm/2 + offmm, idmm, idmm)); + xsection.subtract(new Ellipse2D.Double(odmm/2 - idmm/2 + offmm, odmm/2 - idmm/2, idmm, idmm)); webThickness = null; } @@ -81,5 +83,18 @@ public class Moonburner extends ExtrudedShapeGrain { new Editor(e).showAsWindow(); new GrainPanel(e).showAsWindow(); } + + public void validate() throws ValidationException{ + if ( iD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid iD"); + if ( oD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid oD"); + if ( getLength().equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid Length"); + if ( iD.isGreaterThan(oD) ) + throw new ValidationException(this, "iD > oD"); + if ( coreOffset.isGreaterThan(iD.plus(oD).divide(2.0))) + throw new ValidationException(this, "Core offset too large"); + } } diff --git a/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java b/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java index ad04b09..7d836d5 100644 --- a/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java +++ b/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java @@ -17,8 +17,9 @@ import org.jscience.physics.amount.Amount; import com.billkuker.rocketry.motorsim.ChangeListening; import com.billkuker.rocketry.motorsim.Grain; +import com.billkuker.rocketry.motorsim.Validating; -public class MultiGrain implements Grain, Grain.Composite, PropertyChangeListener { +public class MultiGrain implements Grain, Grain.Composite, PropertyChangeListener, Validating { private Grain grain = null; private int count = 1; @@ -28,6 +29,8 @@ public class MultiGrain implements Grain, Grain.Composite, PropertyChangeListene } public void setCount(int count) { + if ( count <= 0 ) + throw new IllegalArgumentException("Must have at least 1 grain"); this.count = count; } @@ -107,4 +110,10 @@ public class MultiGrain implements Grain, Grain.Composite, PropertyChangeListene firePropertyChange(evt); } + @Override + public void validate() throws ValidationException { + if ( grain instanceof Validating ) + ((Validating)grain).validate(); + } + } diff --git a/src/com/billkuker/rocketry/motorsim/grain/RodAndTubeGrain.java b/src/com/billkuker/rocketry/motorsim/grain/RodAndTubeGrain.java index 1bdb53d..3ce4dae 100644 --- a/src/com/billkuker/rocketry/motorsim/grain/RodAndTubeGrain.java +++ b/src/com/billkuker/rocketry/motorsim/grain/RodAndTubeGrain.java @@ -8,10 +8,11 @@ import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; import com.billkuker.rocketry.motorsim.Grain; +import com.billkuker.rocketry.motorsim.Validating; import com.billkuker.rocketry.motorsim.visual.Editor; import com.billkuker.rocketry.motorsim.visual.GrainPanel; -public class RodAndTubeGrain extends CompoundGrain { +public class RodAndTubeGrain extends CompoundGrain implements Validating { CoredCylindricalGrain rod, tube; public static RodAndTubeGrain DEFAULT_GRAIN = new RodAndTubeGrain(){ @@ -109,4 +110,13 @@ public class RodAndTubeGrain extends CompoundGrain { new Editor(g).showAsWindow(); new GrainPanel(g).showAsWindow(); } + + @Override + public void validate() throws ValidationException { + rod.validate(); + tube.validate(); + if ( rod.getOD().isGreaterThan(tube.getID())) + throw new ValidationException(this, "Rod does not fit inside tube"); + + } } diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index f644354..16eae0f 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -20,6 +20,7 @@ import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; @@ -117,12 +118,14 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { public void run() { final JProgressBar bar = new JProgressBar(0,100); add(bar); + try{ final Burn b = new Burn(motor, new Burn.BurnProgressListener(){ @Override public void setProgress(float f){ bar.setValue((int)(f*100)); } }); + final BurnPanel bp = new BurnPanel(b); SwingUtilities.invokeLater(new Thread() { public void run() { @@ -132,6 +135,12 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { revalidate(); } }); + } catch ( Exception e ){ + remove(bar); + JTextArea t = new JTextArea(e.getMessage()); + t.setEditable(false); + add(t); + } } }.start(); } diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java index 4157d1b..dafddca 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java @@ -1,5 +1,6 @@ package com.billkuker.rocketry.motorsim.visual.workbench; +import java.awt.Color; import java.awt.Component; import javax.swing.JTree; @@ -7,26 +8,50 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import com.billkuker.rocketry.motorsim.Motor; +import com.billkuker.rocketry.motorsim.Validating; +import com.billkuker.rocketry.motorsim.Validating.ValidationException; public class WorkbenchTreeCellRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; @Override - public Component getTreeCellRendererComponent(JTree tree, Object value, + public Component getTreeCellRendererComponent(JTree tree, final Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { - super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, - row, hasFocus); + + String tip = null; + setTextNonSelectionColor(Color.black); + setTextSelectionColor(Color.black); + + Object part = null; if (value instanceof DefaultMutableTreeNode) { - value = ((DefaultMutableTreeNode) value).getUserObject(); + part = ((DefaultMutableTreeNode) value).getUserObject(); + } + + if ( part instanceof Validating ){ + try { + ((Validating)part).validate(); + } catch (ValidationException e) { + setTextSelectionColor(Color.RED); + setTextNonSelectionColor(Color.RED); + setToolTipText(e.getMessage()); + tip = e.getMessage(); + } } - if (value instanceof Motor) { - setText(((Motor) value).getName()); - } else if ( value == null ) { + + super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, + row, hasFocus); + + if (part instanceof Motor) { + setText(((Motor) part).getName()); + } else if ( part == null ) { setText(""); } else { - setText(value.getClass().getSimpleName()); + setText(part.getClass().getSimpleName()); } + setToolTipText(tip); + + return this; } diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java index b24b0aa..85a0942 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java @@ -51,13 +51,14 @@ public class WorkbenchTreeModel extends DefaultTreeModel { } - public class MotorNode extends DefaultMutableTreeNode implements PropertyChangeListener { + public class MotorNode extends PartNode implements PropertyChangeListener { private static final long serialVersionUID = 1L; Motor motor; PartNode cn, nn, gn, fn; public MotorNode(Motor m) { super(m); + setAllowsChildren(true); motor = m; add( cn = new PartNode(m.getChamber())); add( nn = new PartNode(m.getNozzle())); @@ -88,6 +89,7 @@ public class WorkbenchTreeModel extends DefaultTreeModel { } else { nodeChanged(this); } + super.propertyChange(e); } }