From cdc982721197639d551337f52c4ed20223dee346 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Tue, 14 Feb 2012 18:41:46 +0000 Subject: [PATCH] Square grain Thanks Louis Schreyer (info@aquarix.de) --- .../visual/workbench/MotorEditor.java | 2 + .../rocketry/motorsim/grain/Square.java | 79 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/com/billkuker/rocketry/motorsim/grain/Square.java diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index 9264cf2..303e7aa 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -58,6 +58,7 @@ import com.billkuker.rocketry.motorsim.grain.Moonburner; import com.billkuker.rocketry.motorsim.grain.MultiGrain; import com.billkuker.rocketry.motorsim.grain.MultiPort; import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain; +import com.billkuker.rocketry.motorsim.grain.Square; import com.billkuker.rocketry.motorsim.grain.Star; import com.billkuker.rocketry.motorsim.visual.BurnPanel; import com.billkuker.rocketry.motorsim.visual.ClassChooser; @@ -120,6 +121,7 @@ public class MotorEditor extends JPanel implements PropertyChangeListener, FuelR grainTypes.add(CSlot.class); grainTypes.add(EndBurner.class); grainTypes.add(MultiPort.class); + grainTypes.add(Square.class); } private List> chamberTypes = new Vector>(); diff --git a/src/com/billkuker/rocketry/motorsim/grain/Square.java b/src/com/billkuker/rocketry/motorsim/grain/Square.java new file mode 100644 index 0000000..2fba8a1 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/grain/Square.java @@ -0,0 +1,79 @@ +package com.billkuker.rocketry.motorsim.grain; + +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.beans.PropertyVetoException; + +import javax.measure.quantity.Length; +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Validating; +import com.billkuker.rocketry.motorsim.grain.util.BurningShape; +import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain; + +public class Square extends ExtrudedShapeGrain implements Validating { + private Amount oD = Amount.valueOf(30, SI.MILLIMETER); + private Amount side = Amount.valueOf(10, SI.MILLIMETER); + + + public Square(){ + try { + setLength(Amount.valueOf(70, SI.MILLIMETER)); + } catch (PropertyVetoException e) { + e.printStackTrace(); + } + generateGeometry(); + } + + private void generateGeometry(){ + double odmm = oD.doubleValue(SI.MILLIMETER); + double sidemm = side.doubleValue(SI.MILLIMETER); + + xsection = new BurningShape(); + Shape outside = new Ellipse2D.Double(-odmm/2.0, -odmm/2.0, odmm, odmm); + xsection.add(outside); + xsection.inhibit(outside); + webThickness = null; + + Rectangle2D r = new Rectangle2D.Double(-sidemm/2.0, -sidemm/2.0, sidemm, sidemm); + xsection.subtract(r); + + } + + public Amount getOD() { + return oD; + } + + public void setOD(Amount od) throws PropertyVetoException { + if (od.equals(this.oD)) + return; + this.oD = od; + generateGeometry(); + } + + public Amount getCoreSide() { + return side; + } + + public void setCoreSide(Amount side) throws PropertyVetoException { + if (side.equals(this.side)) + return; + this.side = side; + generateGeometry(); + } + + + + @Override + public void validate() throws ValidationException{ + if ( side.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid side"); + if ( oD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid oD"); + if ( getLength().equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid Length"); + } +} -- 2.30.2