From 3ac1dea32bb0306f02727c4240f9512c5e889b36 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Sun, 31 Oct 2010 18:25:04 +0000 Subject: [PATCH] --- .../rocketry/motorsim/io/HTMLExporter.java | 246 ++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 src/com/billkuker/rocketry/motorsim/io/HTMLExporter.java diff --git a/src/com/billkuker/rocketry/motorsim/io/HTMLExporter.java b/src/com/billkuker/rocketry/motorsim/io/HTMLExporter.java new file mode 100644 index 0000000..130038f --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/io/HTMLExporter.java @@ -0,0 +1,246 @@ +package com.billkuker.rocketry.motorsim.io; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URLEncoder; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Iterator; + +import javax.measure.quantity.Duration; +import javax.measure.quantity.Force; +import javax.measure.quantity.Quantity; +import javax.measure.unit.SI; +import javax.measure.unit.Unit; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Burn; +import com.billkuker.rocketry.motorsim.BurnSummary; +import com.billkuker.rocketry.motorsim.GraphSimplifier; +import com.billkuker.rocketry.motorsim.Motor; +import com.billkuker.rocketry.motorsim.RocketScience; +import com.billkuker.rocketry.motorsim.motors.kuker.PVC9; + +public class HTMLExporter { + + @SuppressWarnings("deprecation") + private static String encode(String s) { + return URLEncoder.encode(s).replace("%B2", "%C2%B2"); + } + + private static String toChart( + final Unit xUnit, final Unit yUnit, final Object source, + final String method, final Iterator> domain, String title) + throws SecurityException, NoSuchMethodException, + IllegalArgumentException, IllegalAccessException, + InvocationTargetException { + NumberFormat nf = new DecimalFormat("#.##"); + Method f = source.getClass().getMethod(method, Amount.class); + + double xMin = 0, xMax = 0; + double yMin = 0, yMax = 0; + + StringBuffer xVals = new StringBuffer(); + StringBuffer yVals = new StringBuffer(); + + while (domain.hasNext()) { + Amount aX = domain.next(); + double x = aX.doubleValue(xUnit); + @SuppressWarnings("unchecked") + double y = ((Amount) f.invoke(source, aX)).doubleValue(yUnit); + xMin = x < xMin ? x : xMin; + xMax = x > xMax ? x : xMax; + yMin = y < yMin ? y : yMin; + yMax = y > yMax ? y : yMax; + + xVals.append(nf.format(x)); + xVals.append(","); + yVals.append(nf.format(y)); + yVals.append(","); + } + xVals.deleteCharAt(xVals.length() - 1); + yVals.deleteCharAt(yVals.length() - 1); + + // Get the non-preferred Y Unit + Unit yUnit2 = RocketScience.UnitPreference.SI + .getPreferredUnit(yUnit); + // if ( yUnit2.equals(yUnit) ) + yUnit2 = RocketScience.UnitPreference.NONSI.getPreferredUnit(yUnit); + double y2Min, y2Max; + y2Min = Amount.valueOf(yMin, yUnit).doubleValue(yUnit2); + y2Max = Amount.valueOf(yMax, yUnit).doubleValue(yUnit2); + + // Get the non-preferred X Unit + Unit xUnit2 = RocketScience.UnitPreference.SI + .getPreferredUnit(xUnit); + // if ( xUnit2.equals(xUnit) ) + xUnit2 = RocketScience.UnitPreference.NONSI.getPreferredUnit(xUnit); + double x2Min, x2Max; + x2Min = Amount.valueOf(xMin, xUnit).doubleValue(xUnit2); + x2Max = Amount.valueOf(xMax, xUnit).doubleValue(xUnit2); + + boolean x2 = !xUnit.equals(xUnit2); + boolean y2 = x2 || !yUnit.equals(yUnit2); + + StringBuffer sb = new StringBuffer(); + sb.append("" + title + ""); + + return sb.toString(); + } + + public static void export(Burn b, OutputStream os) throws Exception { + PrintWriter out = new PrintWriter(os); + + BurnSummary bs = new BurnSummary(b); + + out.println(""); + out.print(""); + + out.print(""); + out.print(""); + out.print(""); + + out.print(""); + out.print(""); + + out.print(""); + out.print(""); + + out.print(""); + out.print(""); + out.print(""); + out.print(""); + + + out.print(""); + out.print(""); + + + out.print(""); + out.print(""); + + out.print(""); + out.print(""); + out.print(""); + out.print(""); + + out.print(""); + out.print(""); + /* + out.print(""); + */ + out.print(""); + + out.print(""); + out.print(""); + out.print(""); + out.print(""); + out.print(""); + out.print(""); + out.print(""); + out.print(""); + + out.print("
" + b.getMotor().getName() + "
Rating:" + bs.getRating() + "Total Impulse:" + + RocketScience.ammountToRoundedString(bs.totalImpulse()) + + "Specific Impulse:" + + RocketScience.ammountToRoundedString(bs.specificImpulse()) + + "
Max Thrust:" + + RocketScience.ammountToRoundedString(bs.maxThrust()) + + "Average Thrust:" + + RocketScience.ammountToRoundedString(bs.averageThrust()) + + "Max Pressure:" + + RocketScience.ammountToRoundedString(bs.maxPressure()) + + "
"); + GraphSimplifier thrust = new GraphSimplifier( + b, "thrust", b.getData().keySet().iterator()); + + out.print(toChart(SI.SECOND, SI.NEWTON, thrust, "value", thrust + .getDomain().iterator(), "Thrust")); + out.print(""); + GraphSimplifier pressure = new GraphSimplifier( + b, "pressure", b.getData().keySet().iterator()); + + out.print(toChart(SI.SECOND, + javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL), + pressure, "value", pressure.getDomain().iterator(), "Pressure")); + + out.print("
.ENG FileMotorSim File
"); + out.print(""); + out.print(""); + out.print(""); + out.print("
"); + + out.println("\n"); + out.flush(); + out.close(); + } + + public static void main(String args[]) throws Exception { + + Motor m = new PVC9(); + Burn b = new Burn(m); + + File f = new File("test.html"); + export(b, System.out); + export(b, new FileOutputStream(f)); + + /* + * + * EndBurner g = new EndBurner(); g.setLength(Amount.valueOf(70, + * SI.MILLIMETER)); g.setoD(Amount.valueOf(30, SI.MILLIMETER)); + * g.setPuntDepth(Amount.valueOf(10, SI.MILLIMETER)); + * g.setPuntDiameter(Amount.valueOf(10, SI.MILLIMETER)); + * + * Chart c = new Chart(SI.MILLIMETER, + * SI.MILLIMETER.pow(2).asType(Area.class), g, "surfaceArea"); + * c.setDomain(c.new IntervalDomain(Amount.valueOf(0, SI.CENTIMETER), g + * .webThickness())); + * + * GraphSimplifier gs = new GraphSimplifier(g, "surfaceArea", c.new IntervalDomain(Amount.valueOf(0, + * SI.CENTIMETER), g.webThickness()).iterator()); + * + * System.out.print(toChart(SI.MILLIMETER, + * SI.MILLIMETER.pow(2).asType(Area.class), gs, "value", gs + * .getDomain().iterator(), "Area")); + */ + } + +} -- 2.30.2