From f7f3b737d4bf94579b42066b8f0dfd982fe8c97e Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Fri, 12 Dec 2014 23:32:22 -0700 Subject: [PATCH 1/9] Added MassComponentType enum to allow categorizing mass components This is only the data model. MassComponentType added as an Enum. MassComponentConfig dialog updated to combobox to select. --- core/resources/l10n/messages.properties | 7 ++++ .../rocketcomponent/MassComponent.java | 37 +++++++++++++++++++ .../gui/configdialog/MassComponentConfig.java | 15 ++++++++ 3 files changed, 59 insertions(+) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 6f4be16fb..ce9deb0c6 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -921,6 +921,7 @@ MassComponentCfg.tab.ttip.Radialpos = Radial position configuration MassComponentCfg.lbl.Radialdistance = Radial distance: MassComponentCfg.lbl.Radialdirection = Radial direction: MassComponentCfg.but.Reset = Reset +MassComponentCfg.lbl.type = Object type ! MotorConfig MotorCfg.checkbox.compmotormount = This component is a motor mount @@ -1328,6 +1329,12 @@ TrapezoidFinSet.TrapezoidFinSet = Trapezoidal fin set FreeformFinSet.FreeformFinSet = Freeform fin set !MassComponent MassComponent.MassComponent = Mass component +MassComponent.Altimeter = Altimeter +MassComponent.FlightComputer = Flight computer +MassComponent.DeploymentCharge = Deployment charge +MassComponent.Tracker = Tracker +MassComponent.Payload = Payload +MassComponent.RecoveryHardware = Recovery hardware ! Parachute Parachute.Parachute = Parachute ! ShockCord diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java index 81e5a63d8..ef0c11d94 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java @@ -15,6 +15,28 @@ public class MassComponent extends MassObject { private double mass = 0; + public enum MassComponentType { + MASSCOMPONENT(Application.getTranslator().get("MassComponent.MassComponent")), + ALTIMETER(Application.getTranslator().get("MassComponent.Altimeter")), + FLIGHTCOMPUTER(Application.getTranslator().get("MassComponent.FlightComputer")), + DEPLOYMENTCHARGE(Application.getTranslator().get("MassComponent.DeploymentCharge")), + TRACKER(Application.getTranslator().get("MassComponent.Tracker")), + PAYLOAD(Application.getTranslator().get("MassComponent.Payload")), + RECOVERYHARDWARE(Application.getTranslator().get("MassComponent.RecoveryHardware")); + + private String title; + + MassComponentType(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } + } + + private MassComponentType massComponentType = MassComponentType.MASSCOMPONENT; public MassComponent() { super(); @@ -67,6 +89,21 @@ public class MassComponent extends MassObject { return trans.get("MassComponent.MassComponent"); } + public final MassComponent.MassComponentType getMassComponentType() { + mutex.verify(); + return this.massComponentType; + } + + public void setMassComponentType(MassComponent.MassComponentType compType) { + mutex.verify(); + if (this.massComponentType == compType) { + return; + } + checkState(); + this.massComponentType = compType; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + @Override public boolean allowsChildren() { return false; diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java index cf70d463f..68cc4b6e0 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java @@ -32,7 +32,21 @@ public class MassComponentConfig extends RocketComponentConfig { JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); + //// Mass component type + panel.add(new JLabel(trans.get("MassComponentCfg.lbl.type"))); + @SuppressWarnings("unchecked") + JComboBox typecombo = new JComboBox( + new EnumModel(component, "MassComponentType", + new MassComponent.MassComponentType[] { + MassComponent.MassComponentType.MASSCOMPONENT, + MassComponent.MassComponentType.ALTIMETER, + MassComponent.MassComponentType.FLIGHTCOMPUTER, + MassComponent.MassComponentType.DEPLOYMENTCHARGE, + MassComponent.MassComponentType.TRACKER, + MassComponent.MassComponentType.PAYLOAD, + MassComponent.MassComponentType.RECOVERYHARDWARE})); + panel.add(typecombo, "spanx, growx, wrap"); //// Mass panel.add(new JLabel(trans.get("MassComponentCfg.lbl.Mass"))); @@ -116,6 +130,7 @@ public class MassComponentConfig extends RocketComponentConfig { new DoubleModel(component.getParent(), "Length"))), "w 100lp, wrap"); + //// General and General properties tabbedPane.insertTab(trans.get("MassComponentCfg.tab.General"), null, panel, trans.get("MassComponentCfg.tab.ttip.General"), 0); From 27a372eca56881d60621ff149050396a3da5ece7 Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Sat, 13 Dec 2014 12:31:54 -0700 Subject: [PATCH 2/9] Now drawing most mass types. --- core/resources/l10n/messages.properties | 1 + .../rocketcomponent/MassComponent.java | 3 +- .../gui/configdialog/MassComponentConfig.java | 3 +- .../gui/rocketfigure/MassObjectShapes.java | 138 +++++++++++++++++- 4 files changed, 142 insertions(+), 3 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index ce9deb0c6..32b6a33fb 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -1335,6 +1335,7 @@ MassComponent.DeploymentCharge = Deployment charge MassComponent.Tracker = Tracker MassComponent.Payload = Payload MassComponent.RecoveryHardware = Recovery hardware +MassComponent.Battery = Battery ! Parachute Parachute.Parachute = Parachute ! ShockCord diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java index ef0c11d94..4710debcf 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java @@ -22,7 +22,8 @@ public class MassComponent extends MassObject { DEPLOYMENTCHARGE(Application.getTranslator().get("MassComponent.DeploymentCharge")), TRACKER(Application.getTranslator().get("MassComponent.Tracker")), PAYLOAD(Application.getTranslator().get("MassComponent.Payload")), - RECOVERYHARDWARE(Application.getTranslator().get("MassComponent.RecoveryHardware")); + RECOVERYHARDWARE(Application.getTranslator().get("MassComponent.RecoveryHardware")), + BATTERY(Application.getTranslator().get("MassComponent.Battery")); private String title; diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java index 68cc4b6e0..b4e277192 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java @@ -44,7 +44,8 @@ public class MassComponentConfig extends RocketComponentConfig { MassComponent.MassComponentType.DEPLOYMENTCHARGE, MassComponent.MassComponentType.TRACKER, MassComponent.MassComponentType.PAYLOAD, - MassComponent.MassComponentType.RECOVERYHARDWARE})); + MassComponent.MassComponentType.RECOVERYHARDWARE, + MassComponent.MassComponentType.BATTERY})); panel.add(typecombo, "spanx, growx, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java index c8ea511eb..0d00fd9de 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java @@ -1,10 +1,15 @@ package net.sf.openrocket.gui.rocketfigure; import java.awt.Shape; +import java.awt.geom.Arc2D; import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; @@ -13,7 +18,8 @@ public class MassObjectShapes extends RocketComponentShapes { public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, Transformation transformation) { net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; - + net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType type = ((net.sf.openrocket.rocketcomponent.MassComponent)component).getMassComponentType(); + double length = tube.getLength(); double radius = tube.getRadius(); double arc = Math.min(length, 2*radius) * 0.7; @@ -24,6 +30,30 @@ public class MassObjectShapes extends RocketComponentShapes { s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, length*S,2*radius*S,arc*S,arc*S); } + + switch (type) { + case ALTIMETER: + s = addAltimeterSymbol(s); + break; + case FLIGHTCOMPUTER: + s = addFlightComputerSymbol(s); + break; + case DEPLOYMENTCHARGE: + s = addDeploymentChargeSymbol(s); + break; + case RECOVERYHARDWARE: + s = addRecoveryHardwareSymbol(s); + break; + case PAYLOAD: + s = addPayloadSymbol(s); + break; + case TRACKER: + s = addTrackerSymbol(s); + break; + case BATTERY: + s = addBatterySymbol(s); + } + return s; } @@ -43,5 +73,111 @@ public class MassObjectShapes extends RocketComponentShapes { return s; } + private static Shape[] addAltimeterSymbol(Shape[] baseShape){ + Shape[] newShape = new Shape[baseShape.length+1]; + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin = bounds.getHeight()/8.0; + Double hMargin = bounds.getWidth()/2.25; + Double halfArrowWidth=MathUtil.min(hMargin, vMargin); + newShape[0]=baseShape[0]; + + Path2D.Double symbol = new Path2D.Double(); + symbol.moveTo(bounds.getCenterX(), bounds.getY()+vMargin); + symbol.lineTo(bounds.getCenterX(), bounds.getY()+7*vMargin); + symbol.lineTo(bounds.getCenterX()-halfArrowWidth, bounds.getY()+6*vMargin); + symbol.lineTo(bounds.getCenterX()+halfArrowWidth, bounds.getY()+6*vMargin); + symbol.lineTo(bounds.getCenterX(), bounds.getY()+7*vMargin); + + newShape[1]= symbol; + return newShape; + } + + private static Shape[] addFlightComputerSymbol(Shape[] baseShape){ + int pins=12; + Shape[] newShape = new Shape[baseShape.length+1+pins]; + + Rectangle2D bounds = baseShape[0].getBounds2D(); + + + Double vMargin = bounds.getHeight()/8.0; + Double hMargin = bounds.getWidth()/6.0; + Double pinHeight=vMargin; + Double pinSpacing=(bounds.getWidth()-2*hMargin)/(pins+1); + Double pinWidth=pinSpacing/2; + newShape[0]=baseShape[0]; + newShape[1]=new Rectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+2*vMargin, 4*hMargin,4*vMargin); + for(int i=0; i<(pins/2); i++){ + newShape[i+2]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+6*vMargin, pinWidth, pinHeight); + newShape[i+pins/2+2]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+vMargin, pinWidth, pinHeight); + } + //newShape[1]=symbol; + return newShape; + } + + private static Shape[] addTrackerSymbol(Shape[] baseShape){ + Shape[] newShape = new Shape[baseShape.length+7]; + + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin=bounds.getWidth()/10; + + Double xCenter=bounds.getCenterX(); + Double yCenter=bounds.getCenterY(); + newShape[0]=baseShape[0]; + + Double arcExtent = 60.0; + Double arcStart1 = 360-arcExtent/2; + Double arcStart2 = 180-arcExtent/2; + + if(3*vMargin*Math.sin(Math.toRadians(arcExtent/2))>0.9*bounds.getHeight()/2){ + vMargin=0.9*bounds.getHeight()/(6*Math.sin(Math.toRadians(arcExtent/2))); + } + newShape[1]= new Ellipse2D.Double(xCenter-vMargin/2, yCenter-vMargin/2,vMargin,vMargin); + for(int i=1; i<4; i++){ + newShape[i+1]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart1,arcExtent,Arc2D.OPEN); + newShape[i+4]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart2,arcExtent,Arc2D.OPEN); + } + return newShape; + } + private static Shape[] addPayloadSymbol(Shape[] baseShape){ + return baseShape; + } + private static Shape[] addRecoveryHardwareSymbol(Shape[] baseShape){ + return baseShape; + } + private static Shape[] addDeploymentChargeSymbol(Shape[] baseShape){ + return baseShape; + } + + private static Shape[] addBatterySymbol(Shape[] baseShape){ + Shape[] newShape = new Shape[baseShape.length+1]; + Rectangle2D bounds = baseShape[0].getBounds2D(); + + + Double vMargin = bounds.getHeight()/8.0; + Double hMargin = bounds.getWidth()/3.0; + Double cellWidth=hMargin/3.0; + Double cellTop=bounds.getY()+7*vMargin; + Double cellBottom=bounds.getY()+vMargin; + + newShape[0]=baseShape[0]; + + Path2D.Double symbol = new Path2D.Double(); + symbol.moveTo(bounds.getX()+hMargin, bounds.getCenterY()); + symbol.lineTo(bounds.getX()+2*hMargin/3, bounds.getCenterY()); + for(Double x=bounds.getX()+hMargin; x Date: Sat, 13 Dec 2014 13:49:48 -0700 Subject: [PATCH 3/9] All mass types being drawn. --- .../gui/rocketfigure/MassObjectShapes.java | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java index 0d00fd9de..fbf20809e 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java @@ -7,6 +7,7 @@ import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; +import java.util.Random; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; @@ -139,13 +140,52 @@ public class MassObjectShapes extends RocketComponentShapes { return newShape; } private static Shape[] addPayloadSymbol(Shape[] baseShape){ - return baseShape; + Shape[] newShape = new Shape[baseShape.length+1]; + newShape[0]=baseShape[0]; + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin=bounds.getHeight()/10; + Double hMargin=bounds.getWidth()/10; + + + newShape[1]= new Ellipse2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin); + + return newShape; } private static Shape[] addRecoveryHardwareSymbol(Shape[] baseShape){ - return baseShape; + Shape[] newShape = new Shape[baseShape.length+3]; + newShape[0]=baseShape[0]; + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin=bounds.getHeight()/8; + Double hMargin=bounds.getWidth()/8; + + + newShape[1]= new RoundRectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin, 15, 5); + newShape[2]= new RoundRectangle2D.Double(bounds.getX()+hMargin+vMargin, bounds.getY()+2*vMargin,bounds.getWidth()-2*hMargin-2*vMargin,bounds.getHeight()-4*vMargin, 15, 5); + newShape[3]= new Rectangle2D.Double(bounds.getCenterX()-1.5*hMargin, bounds.getCenterY()+1.5*vMargin, 3*hMargin, 2*vMargin); + return newShape; } + private static Shape[] addDeploymentChargeSymbol(Shape[] baseShape){ - return baseShape; + int rays=15; + Shape[] newShape = new Shape[baseShape.length+rays]; + newShape[0]=baseShape[0]; + + Rectangle2D bounds = baseShape[0].getBounds2D(); + + Double vMargin=bounds.getWidth()/10; + Double xCenter=bounds.getCenterX(); + Double yCenter=bounds.getCenterY(); + Random rand = new Random(); + + newShape[1]= new Arc2D.Double(xCenter-2*vMargin, yCenter-2*vMargin,4*vMargin,4*vMargin, 55.0, 180.0, Arc2D.OPEN); + for(int i=1; i Date: Sat, 13 Dec 2014 15:21:09 -0700 Subject: [PATCH 4/9] Mass types now save. --- .../openrocket/importt/DocumentConfig.java | 8 +++++++ .../openrocket/savers/MassComponentSaver.java | 21 ++++++++++++------- .../rocketcomponent/MassComponent.java | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java index dc14486d0..2e909207d 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java @@ -314,6 +314,14 @@ class DocumentConfig { // MassComponent setters.put("MassComponent:mass", new DoubleSetter( Reflection.findMethod(MassComponent.class, "setComponentMass", double.class))); + /*setters.put("MassComponent:masscomponenttype", new DoubleSetter( + Reflection.findMethod(MassComponent.class, "setMassComponentType", double.class)));*/ + setters.put("MassComponent:masscomponenttype", new EnumSetter( + Reflection.findMethod(MassComponent.class, "setMassComponentType", MassComponent.MassComponentType.class), + MassComponent.MassComponentType.class)); + /* setters.put("Transition:shape", new EnumSetter( + Reflection.findMethod(Transition.class, "setType", Transition.Shape.class), + Transition.Shape.class));*/ // ShockCord setters.put("ShockCord:cordlength", new DoubleSetter( diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/MassComponentSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/MassComponentSaver.java index 093303c26..8cfddff50 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/MassComponentSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/MassComponentSaver.java @@ -2,31 +2,36 @@ package net.sf.openrocket.file.openrocket.savers; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import net.sf.openrocket.rocketcomponent.MassComponent; +import net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType; public class MassComponentSaver extends MassObjectSaver { - + private static final MassComponentSaver instance = new MassComponentSaver(); - + public static List getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { List list = new ArrayList(); - + list.add(""); instance.addParams(c, list); list.add(""); - + return list; } - + @Override protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List elements) { super.addParams(c, elements); - + MassComponent mass = (MassComponent) c; - + elements.add("" + mass.getMass() + ""); + + MassComponentType type = mass.getMassComponentType(); + elements.add("" + type.name().toLowerCase(Locale.ENGLISH) + ""); + } - } diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java index 4710debcf..e49421a2c 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java @@ -15,7 +15,7 @@ public class MassComponent extends MassObject { private double mass = 0; - public enum MassComponentType { + public static enum MassComponentType { MASSCOMPONENT(Application.getTranslator().get("MassComponent.MassComponent")), ALTIMETER(Application.getTranslator().get("MassComponent.Altimeter")), FLIGHTCOMPUTER(Application.getTranslator().get("MassComponent.FlightComputer")), From f0609029e8351df4d308e5da595c7dd3791ab707 Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Sat, 13 Dec 2014 15:41:36 -0700 Subject: [PATCH 5/9] Clean up how symbol is added to themes component shape. Ready for release. --- .../gui/rocketfigure/MassObjectShapes.java | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java index fbf20809e..804aaf034 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java @@ -53,6 +53,8 @@ public class MassObjectShapes extends RocketComponentShapes { break; case BATTERY: s = addBatterySymbol(s); + break; + case MASSCOMPONENT: } return s; @@ -75,12 +77,14 @@ public class MassObjectShapes extends RocketComponentShapes { } private static Shape[] addAltimeterSymbol(Shape[] baseShape){ + int offset=baseShape.length; Shape[] newShape = new Shape[baseShape.length+1]; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + Rectangle2D bounds = baseShape[0].getBounds2D(); Double vMargin = bounds.getHeight()/8.0; Double hMargin = bounds.getWidth()/2.25; Double halfArrowWidth=MathUtil.min(hMargin, vMargin); - newShape[0]=baseShape[0]; Path2D.Double symbol = new Path2D.Double(); symbol.moveTo(bounds.getCenterX(), bounds.getY()+vMargin); @@ -89,13 +93,15 @@ public class MassObjectShapes extends RocketComponentShapes { symbol.lineTo(bounds.getCenterX()+halfArrowWidth, bounds.getY()+6*vMargin); symbol.lineTo(bounds.getCenterX(), bounds.getY()+7*vMargin); - newShape[1]= symbol; + newShape[offset]= symbol; return newShape; } private static Shape[] addFlightComputerSymbol(Shape[] baseShape){ int pins=12; + int offset=baseShape.length; Shape[] newShape = new Shape[baseShape.length+1+pins]; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); Rectangle2D bounds = baseShape[0].getBounds2D(); @@ -105,11 +111,10 @@ public class MassObjectShapes extends RocketComponentShapes { Double pinHeight=vMargin; Double pinSpacing=(bounds.getWidth()-2*hMargin)/(pins+1); Double pinWidth=pinSpacing/2; - newShape[0]=baseShape[0]; - newShape[1]=new Rectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+2*vMargin, 4*hMargin,4*vMargin); + newShape[offset]=new Rectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+2*vMargin, 4*hMargin,4*vMargin); for(int i=0; i<(pins/2); i++){ - newShape[i+2]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+6*vMargin, pinWidth, pinHeight); - newShape[i+pins/2+2]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+vMargin, pinWidth, pinHeight); + newShape[i+1+offset]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+6*vMargin, pinWidth, pinHeight); + newShape[i+pins/2+1+offset]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+vMargin, pinWidth, pinHeight); } //newShape[1]=symbol; return newShape; @@ -117,13 +122,14 @@ public class MassObjectShapes extends RocketComponentShapes { private static Shape[] addTrackerSymbol(Shape[] baseShape){ Shape[] newShape = new Shape[baseShape.length+7]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); Rectangle2D bounds = baseShape[0].getBounds2D(); Double vMargin=bounds.getWidth()/10; Double xCenter=bounds.getCenterX(); Double yCenter=bounds.getCenterY(); - newShape[0]=baseShape[0]; Double arcExtent = 60.0; Double arcStart1 = 360-arcExtent/2; @@ -132,43 +138,47 @@ public class MassObjectShapes extends RocketComponentShapes { if(3*vMargin*Math.sin(Math.toRadians(arcExtent/2))>0.9*bounds.getHeight()/2){ vMargin=0.9*bounds.getHeight()/(6*Math.sin(Math.toRadians(arcExtent/2))); } - newShape[1]= new Ellipse2D.Double(xCenter-vMargin/2, yCenter-vMargin/2,vMargin,vMargin); + newShape[offset]= new Ellipse2D.Double(xCenter-vMargin/2, yCenter-vMargin/2,vMargin,vMargin); for(int i=1; i<4; i++){ - newShape[i+1]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart1,arcExtent,Arc2D.OPEN); - newShape[i+4]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart2,arcExtent,Arc2D.OPEN); + newShape[i+offset]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart1,arcExtent,Arc2D.OPEN); + newShape[i+3+offset]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart2,arcExtent,Arc2D.OPEN); } return newShape; } private static Shape[] addPayloadSymbol(Shape[] baseShape){ Shape[] newShape = new Shape[baseShape.length+1]; - newShape[0]=baseShape[0]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + Rectangle2D bounds = baseShape[0].getBounds2D(); Double vMargin=bounds.getHeight()/10; Double hMargin=bounds.getWidth()/10; - newShape[1]= new Ellipse2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin); + newShape[offset]= new Ellipse2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin); return newShape; } private static Shape[] addRecoveryHardwareSymbol(Shape[] baseShape){ Shape[] newShape = new Shape[baseShape.length+3]; - newShape[0]=baseShape[0]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); Rectangle2D bounds = baseShape[0].getBounds2D(); Double vMargin=bounds.getHeight()/8; Double hMargin=bounds.getWidth()/8; - newShape[1]= new RoundRectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin, 15, 5); - newShape[2]= new RoundRectangle2D.Double(bounds.getX()+hMargin+vMargin, bounds.getY()+2*vMargin,bounds.getWidth()-2*hMargin-2*vMargin,bounds.getHeight()-4*vMargin, 15, 5); - newShape[3]= new Rectangle2D.Double(bounds.getCenterX()-1.5*hMargin, bounds.getCenterY()+1.5*vMargin, 3*hMargin, 2*vMargin); + newShape[offset]= new RoundRectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin, 15, 5); + newShape[offset+1]= new RoundRectangle2D.Double(bounds.getX()+hMargin+vMargin, bounds.getY()+2*vMargin,bounds.getWidth()-2*hMargin-2*vMargin,bounds.getHeight()-4*vMargin, 15, 5); + newShape[offset+2]= new Rectangle2D.Double(bounds.getCenterX()-1.5*hMargin, bounds.getCenterY()+1.5*vMargin, 3*hMargin, 2*vMargin); return newShape; } private static Shape[] addDeploymentChargeSymbol(Shape[] baseShape){ int rays=15; - Shape[] newShape = new Shape[baseShape.length+rays]; - newShape[0]=baseShape[0]; + Shape[] newShape = new Shape[baseShape.length+2]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); Rectangle2D bounds = baseShape[0].getBounds2D(); @@ -177,13 +187,16 @@ public class MassObjectShapes extends RocketComponentShapes { Double yCenter=bounds.getCenterY(); Random rand = new Random(); - newShape[1]= new Arc2D.Double(xCenter-2*vMargin, yCenter-2*vMargin,4*vMargin,4*vMargin, 55.0, 180.0, Arc2D.OPEN); + newShape[offset]= new Arc2D.Double(xCenter-2*vMargin, yCenter-2*vMargin,4*vMargin,4*vMargin, 55.0, 180.0, Arc2D.CHORD); + + Path2D.Double explosion = new Path2D.Double(); + newShape[offset+1]=explosion; + for(int i=1; i Date: Sat, 13 Dec 2014 16:45:49 -0700 Subject: [PATCH 6/9] Sum up mass of subcomponent and put in component tree tooltip. --- .../openrocket/rocketcomponent/RocketComponent.java | 13 +++++++++++++ .../main/componenttree/ComponentTreeRenderer.java | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index baa175065..30cb2ceaa 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -1121,6 +1121,19 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab return getComponentMass(); } + /** + * Return the mass of this component and all of its subcomponents. + */ + public final double getSectionMass() { + Double massSubtotal = getMass(); + mutex.verify(); + for (RocketComponent rc : children) { + massSubtotal += rc.getSectionMass(); + } + + return massSubtotal; + } + /** * Return the (possibly overridden) center of gravity and mass. * diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java index 719229d75..6f4423457 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java @@ -69,7 +69,10 @@ public class ComponentTreeRenderer extends DefaultTreeCellRenderer { sb.append("").append(c.getName()).append(""); if (c.isMassive() || c.isMassOverridden() ) { - sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getMass())).append(")"); + sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getMass())).append(" of "); + sb.append(UnitGroup.UNITS_MASS.toStringUnit(c.getSectionMass())).append( " total)"); + } else { + sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getSectionMass())).append( " total)"); } if ( c.isMassOverridden() ) { From c741079fd605c11dc1d236a596ba93c1b07bf719 Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Sun, 14 Dec 2014 10:27:24 -0700 Subject: [PATCH 7/9] Restructuring and adding symbols to all MassObjects. --- .../gui/rocketfigure/MassComponentShapes.java | 237 ++++++++++++++++++ .../gui/rocketfigure/MassObjectShapes.java | 190 -------------- .../gui/rocketfigure/ParachuteShapes.java | 76 ++++++ 3 files changed, 313 insertions(+), 190 deletions(-) create mode 100644 swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java create mode 100644 swing/src/net/sf/openrocket/gui/rocketfigure/ParachuteShapes.java diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java new file mode 100644 index 000000000..20730e33d --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java @@ -0,0 +1,237 @@ +package net.sf.openrocket.gui.rocketfigure; + +import java.awt.Shape; +import java.awt.geom.Arc2D; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import java.util.Random; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Transformation; + + +public class MassComponentShapes extends RocketComponentShapes { + + public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, + Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + + net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType type = ((net.sf.openrocket.rocketcomponent.MassComponent)component).getMassComponentType(); + + double length = tube.getLength(); + double radius = tube.getRadius(); + double arc = Math.min(length, 2*radius) * 0.7; + Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[start.length]; + for (int i=0; i < start.length; i++) { + s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, + length*S,2*radius*S,arc*S,arc*S); + } + + switch (type) { + case ALTIMETER: + s = addAltimeterSymbol(s); + break; + case FLIGHTCOMPUTER: + s = addFlightComputerSymbol(s); + break; + case DEPLOYMENTCHARGE: + s = addDeploymentChargeSymbol(s); + break; + case RECOVERYHARDWARE: + s = addRecoveryHardwareSymbol(s); + break; + case PAYLOAD: + s = addPayloadSymbol(s); + break; + case TRACKER: + s = addTrackerSymbol(s); + break; + case BATTERY: + s = addBatterySymbol(s); + break; + case MASSCOMPONENT: + } + + return s; + } + + + public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, + Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + + double or = tube.getRadius(); + + Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[start.length]; + for (int i=0; i < start.length; i++) { + s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); + } + return s; + } + + private static Shape[] addAltimeterSymbol(Shape[] baseShape){ + int offset=baseShape.length; + Shape[] newShape = new Shape[baseShape.length+1]; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin = bounds.getHeight()/8.0; + Double hMargin = bounds.getWidth()/2.25; + Double halfArrowWidth=MathUtil.min(hMargin, vMargin); + + Path2D.Double symbol = new Path2D.Double(); + symbol.moveTo(bounds.getCenterX(), bounds.getY()+vMargin); + symbol.lineTo(bounds.getCenterX(), bounds.getY()+7*vMargin); + symbol.lineTo(bounds.getCenterX()-halfArrowWidth, bounds.getY()+6*vMargin); + symbol.lineTo(bounds.getCenterX()+halfArrowWidth, bounds.getY()+6*vMargin); + symbol.lineTo(bounds.getCenterX(), bounds.getY()+7*vMargin); + + newShape[offset]= symbol; + return newShape; + } + + private static Shape[] addFlightComputerSymbol(Shape[] baseShape){ + int pins=12; + int offset=baseShape.length; + Shape[] newShape = new Shape[baseShape.length+1+pins]; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + + + Double vMargin = bounds.getHeight()/8.0; + Double hMargin = bounds.getWidth()/6.0; + Double pinHeight=vMargin; + Double pinSpacing=(bounds.getWidth()-2*hMargin)/(pins+1); + Double pinWidth=pinSpacing/2; + newShape[offset]=new Rectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+2*vMargin, 4*hMargin,4*vMargin); + for(int i=0; i<(pins/2); i++){ + newShape[i+1+offset]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+6*vMargin, pinWidth, pinHeight); + newShape[i+pins/2+1+offset]=new Rectangle2D.Double(bounds.getX()+hMargin+2*i*pinSpacing+pinSpacing, bounds.getY()+vMargin, pinWidth, pinHeight); + } + //newShape[1]=symbol; + return newShape; + } + + private static Shape[] addTrackerSymbol(Shape[] baseShape){ + Shape[] newShape = new Shape[baseShape.length+7]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin=bounds.getWidth()/10; + + Double xCenter=bounds.getCenterX(); + Double yCenter=bounds.getCenterY(); + + Double arcExtent = 60.0; + Double arcStart1 = 360-arcExtent/2; + Double arcStart2 = 180-arcExtent/2; + + if(3*vMargin*Math.sin(Math.toRadians(arcExtent/2))>0.9*bounds.getHeight()/2){ + vMargin=0.9*bounds.getHeight()/(6*Math.sin(Math.toRadians(arcExtent/2))); + } + newShape[offset]= new Ellipse2D.Double(xCenter-vMargin/2, yCenter-vMargin/2,vMargin,vMargin); + for(int i=1; i<4; i++){ + newShape[i+offset]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart1,arcExtent,Arc2D.OPEN); + newShape[i+3+offset]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart2,arcExtent,Arc2D.OPEN); + } + return newShape; + } + private static Shape[] addPayloadSymbol(Shape[] baseShape){ + Shape[] newShape = new Shape[baseShape.length+1]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin=bounds.getHeight()/10; + Double hMargin=bounds.getWidth()/10; + + + newShape[offset]= new Ellipse2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin); + + return newShape; + } + private static Shape[] addRecoveryHardwareSymbol(Shape[] baseShape){ + Shape[] newShape = new Shape[baseShape.length+3]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + Rectangle2D bounds = baseShape[0].getBounds2D(); + Double vMargin=bounds.getHeight()/8; + Double hMargin=bounds.getWidth()/8; + + + newShape[offset]= new RoundRectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin, 15, 5); + newShape[offset+1]= new RoundRectangle2D.Double(bounds.getX()+hMargin+vMargin, bounds.getY()+2*vMargin,bounds.getWidth()-2*hMargin-2*vMargin,bounds.getHeight()-4*vMargin, 15, 5); + newShape[offset+2]= new Rectangle2D.Double(bounds.getCenterX()-1.5*hMargin, bounds.getCenterY()+1.5*vMargin, 3*hMargin, 2*vMargin); + return newShape; + } + + private static Shape[] addDeploymentChargeSymbol(Shape[] baseShape){ + int rays=15; + Shape[] newShape = new Shape[baseShape.length+2]; + int offset=baseShape.length; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + + Double vMargin=bounds.getWidth()/10; + Double xCenter=bounds.getCenterX(); + Double yCenter=bounds.getCenterY(); + Random rand = new Random(); + + newShape[offset]= new Arc2D.Double(xCenter-2*vMargin, yCenter-2*vMargin,4*vMargin,4*vMargin, 55.0, 180.0, Arc2D.CHORD); + + Path2D.Double explosion = new Path2D.Double(); + newShape[offset+1]=explosion; + + for(int i=1; i0.9*bounds.getHeight()/2){ - vMargin=0.9*bounds.getHeight()/(6*Math.sin(Math.toRadians(arcExtent/2))); - } - newShape[offset]= new Ellipse2D.Double(xCenter-vMargin/2, yCenter-vMargin/2,vMargin,vMargin); - for(int i=1; i<4; i++){ - newShape[i+offset]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart1,arcExtent,Arc2D.OPEN); - newShape[i+3+offset]= new Arc2D.Double(xCenter-i*vMargin, yCenter-i*vMargin, 2*i*vMargin, 2*i*vMargin, arcStart2,arcExtent,Arc2D.OPEN); - } - return newShape; - } - private static Shape[] addPayloadSymbol(Shape[] baseShape){ - Shape[] newShape = new Shape[baseShape.length+1]; - int offset=baseShape.length; - System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); - - Rectangle2D bounds = baseShape[0].getBounds2D(); - Double vMargin=bounds.getHeight()/10; - Double hMargin=bounds.getWidth()/10; - - - newShape[offset]= new Ellipse2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin); - - return newShape; - } - private static Shape[] addRecoveryHardwareSymbol(Shape[] baseShape){ - Shape[] newShape = new Shape[baseShape.length+3]; - int offset=baseShape.length; - System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); - Rectangle2D bounds = baseShape[0].getBounds2D(); - Double vMargin=bounds.getHeight()/8; - Double hMargin=bounds.getWidth()/8; - - - newShape[offset]= new RoundRectangle2D.Double(bounds.getX()+hMargin, bounds.getY()+vMargin,bounds.getWidth()-2*hMargin,bounds.getHeight()-2*vMargin, 15, 5); - newShape[offset+1]= new RoundRectangle2D.Double(bounds.getX()+hMargin+vMargin, bounds.getY()+2*vMargin,bounds.getWidth()-2*hMargin-2*vMargin,bounds.getHeight()-4*vMargin, 15, 5); - newShape[offset+2]= new Rectangle2D.Double(bounds.getCenterX()-1.5*hMargin, bounds.getCenterY()+1.5*vMargin, 3*hMargin, 2*vMargin); - return newShape; - } - - private static Shape[] addDeploymentChargeSymbol(Shape[] baseShape){ - int rays=15; - Shape[] newShape = new Shape[baseShape.length+2]; - int offset=baseShape.length; - System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); - - Rectangle2D bounds = baseShape[0].getBounds2D(); - - Double vMargin=bounds.getWidth()/10; - Double xCenter=bounds.getCenterX(); - Double yCenter=bounds.getCenterY(); - Random rand = new Random(); - - newShape[offset]= new Arc2D.Double(xCenter-2*vMargin, yCenter-2*vMargin,4*vMargin,4*vMargin, 55.0, 180.0, Arc2D.CHORD); - - Path2D.Double explosion = new Path2D.Double(); - newShape[offset+1]=explosion; - - for(int i=1; i0.75*bounds.getWidth()) + chuteDiameter=0.75*bounds.getWidth(); + + newShape[offset]=new Arc2D.Double(bounds.getCenterX()-chuteDiameter/2, bounds.getCenterY()-chuteDiameter/4, + chuteDiameter,chuteDiameter,180.0,180.0,Arc2D.PIE); + Path2D.Double shrouds = new Path2D.Double(); + shrouds.moveTo(bounds.getCenterX()-chuteDiameter/2, bounds.getCenterY()+chuteDiameter/4); + shrouds.lineTo(bounds.getCenterX(), bounds.getCenterY()-3*chuteDiameter/4); + shrouds.lineTo(bounds.getCenterX()+chuteDiameter/2, bounds.getCenterY()+chuteDiameter/4); + + shrouds.moveTo(bounds.getCenterX()-chuteDiameter/4, bounds.getCenterY()+chuteDiameter/4); + shrouds.lineTo(bounds.getCenterX(), bounds.getCenterY()-3*chuteDiameter/4); + shrouds.lineTo(bounds.getCenterX()+chuteDiameter/4, bounds.getCenterY()+chuteDiameter/4); + + shrouds.moveTo(bounds.getCenterX(), bounds.getCenterY()+chuteDiameter/4); + shrouds.lineTo(bounds.getCenterX(), bounds.getCenterY()-3*chuteDiameter/4); + + newShape[offset+1]=shrouds; + return newShape; + } +} From 8a8bb51f488ae2bc17976ef943ce4c8e9e0cf83f Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Sun, 14 Dec 2014 12:03:25 -0700 Subject: [PATCH 8/9] Added Stream and Shock cord symbology. --- .../gui/rocketfigure/ShockCordShapes.java | 71 +++++++++++++++++ .../gui/rocketfigure/StreamerShapes.java | 79 +++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java create mode 100644 swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java new file mode 100644 index 000000000..79ffdb89c --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java @@ -0,0 +1,71 @@ +package net.sf.openrocket.gui.rocketfigure; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Transformation; + +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +public class ShockCordShapes extends RocketComponentShapes { + + public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, + Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + + double length = tube.getLength(); + double radius = tube.getRadius(); + double arc = Math.min(length, 2*radius) * 0.7; + Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[start.length]; + for (int i=0; i < start.length; i++) { + s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, + length*S,2*radius*S,arc*S,arc*S); + } + return addSymbol(s); + } + + + public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, + Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + + double or = tube.getRadius(); + + Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[start.length]; + for (int i=0; i < start.length; i++) { + s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); + } + return s; + } + + private static Shape[] addSymbol(Shape[] baseShape){ + int offset=baseShape.length; + Shape[] newShape = new Shape[baseShape.length+1]; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + + Double left=bounds.getX()+bounds.getWidth()/4; + Double cordWidth=bounds.getWidth()/2; + Double top=bounds.getCenterY(); + Double flutterHeight=bounds.getHeight()/4; + Double flutterWidth=cordWidth/4; + + Path2D.Double streamer= new Path2D.Double(); + streamer.moveTo(left, bounds.getCenterY()); + + for(int i=0; i<4; i++){ + streamer.curveTo(left+(4*i+1)*flutterWidth/4, top+flutterHeight, left+(4*i+1)*flutterWidth/4, top+flutterHeight, left+(4*i+2)*flutterWidth/4, top); + streamer.curveTo(left+(4*i+3)*flutterWidth/4, top-flutterHeight, left+(4*i+3)*flutterWidth/4, top-flutterHeight, left+(4*i+4)*flutterWidth/4, top); + } + + newShape[offset]=streamer; + return newShape; + } +} diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java new file mode 100644 index 000000000..7a5f41bd9 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java @@ -0,0 +1,79 @@ +package net.sf.openrocket.gui.rocketfigure; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Transformation; + +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +public class StreamerShapes extends RocketComponentShapes { + + public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, + Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + + double length = tube.getLength(); + double radius = tube.getRadius(); + double arc = Math.min(length, 2*radius) * 0.7; + Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[start.length]; + for (int i=0; i < start.length; i++) { + s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, + length*S,2*radius*S,arc*S,arc*S); + } + return addSymbol(s); + } + + + public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, + Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + + double or = tube.getRadius(); + + Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[start.length]; + for (int i=0; i < start.length; i++) { + s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); + } + return s; + } + + private static Shape[] addSymbol(Shape[] baseShape){ + int offset=baseShape.length; + Shape[] newShape = new Shape[baseShape.length+1]; + System.arraycopy(baseShape, 0, newShape, 0, baseShape.length); + + Rectangle2D bounds = baseShape[0].getBounds2D(); + + Double left=bounds.getX()+bounds.getWidth()/4; + Double streamerWidth=bounds.getWidth()/2; + Double streamerHeight=bounds.getHeight()/2; + Double top=bounds.getCenterY()+streamerHeight/2; + Double bottom=bounds.getCenterY()-streamerHeight/2; + Double flutterHeight=bounds.getHeight()/16; + Double flutterWidth=streamerWidth/4; + + Path2D.Double streamer= new Path2D.Double(); + streamer.moveTo(left, bottom); //bottom left + streamer.lineTo(left, top); //upper left + for(int i=0; i<4; i++){ + streamer.curveTo(left+(4*i+1)*flutterWidth/4, top+flutterHeight, left+(4*i+1)*flutterWidth/4, top+flutterHeight, left+(4*i+2)*flutterWidth/4, top); + streamer.curveTo(left+(4*i+3)*flutterWidth/4, top-flutterHeight, left+(4*i+3)*flutterWidth/4, top-flutterHeight, left+(4*i+4)*flutterWidth/4, top); + } + streamer.lineTo(left+streamerWidth, bottom); + streamer.moveTo(left, bottom); //bottom left + for(int i=0; i<4; i++){ + streamer.curveTo(left+(4*i+1)*flutterWidth/4, bottom+flutterHeight, left+(4*i+1)*flutterWidth/4, bottom+flutterHeight, left+(4*i+2)*flutterWidth/4, bottom); + streamer.curveTo(left+(4*i+3)*flutterWidth/4, bottom-flutterHeight, left+(4*i+3)*flutterWidth/4, bottom-flutterHeight, left+(4*i+4)*flutterWidth/4, bottom); + } + + newShape[offset]=streamer; + return newShape; + } +} From ded4df81031a92c20ca638434becfb1699a9e1f7 Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Mon, 15 Dec 2014 20:34:14 -0700 Subject: [PATCH 9/9] Fixed 3 issues kruland had with mass type. 1. Mass tooltip only displays totals for components that have children. 2. setMassComponentType now fires NON_FUNCTIONAL change event. 3. Label now reads "Mass Type" and default is "Unspecified". --- core/resources/l10n/messages.properties | 4 ++-- .../sf/openrocket/rocketcomponent/MassComponent.java | 2 +- .../gui/main/componenttree/ComponentTreeRenderer.java | 11 ++++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 32b6a33fb..11ccd3456 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -921,7 +921,7 @@ MassComponentCfg.tab.ttip.Radialpos = Radial position configuration MassComponentCfg.lbl.Radialdistance = Radial distance: MassComponentCfg.lbl.Radialdirection = Radial direction: MassComponentCfg.but.Reset = Reset -MassComponentCfg.lbl.type = Object type +MassComponentCfg.lbl.type = Mass type ! MotorConfig MotorCfg.checkbox.compmotormount = This component is a motor mount @@ -1328,7 +1328,7 @@ TrapezoidFinSet.TrapezoidFinSet = Trapezoidal fin set ! FreeformFinSet FreeformFinSet.FreeformFinSet = Freeform fin set !MassComponent -MassComponent.MassComponent = Mass component +MassComponent.MassComponent = Unspecified MassComponent.Altimeter = Altimeter MassComponent.FlightComputer = Flight computer MassComponent.DeploymentCharge = Deployment charge diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java index e49421a2c..0bfb75c03 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java @@ -102,7 +102,7 @@ public class MassComponent extends MassObject { } checkState(); this.massComponentType = compType; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } @Override diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java index 6f4423457..2539cc4cb 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java @@ -69,10 +69,15 @@ public class ComponentTreeRenderer extends DefaultTreeCellRenderer { sb.append("").append(c.getName()).append(""); if (c.isMassive() || c.isMassOverridden() ) { - sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getMass())).append(" of "); - sb.append(UnitGroup.UNITS_MASS.toStringUnit(c.getSectionMass())).append( " total)"); + sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getMass())); + if(c.getChildCount()>0){ + sb.append(" of ").append(UnitGroup.UNITS_MASS.toStringUnit(c.getSectionMass())).append( " total"); + } + sb.append(")"); } else { - sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getSectionMass())).append( " total)"); + if((c.getChildCount()>0) && (c.getSectionMass()>0)){ + sb.append(" (").append(UnitGroup.UNITS_MASS.toStringUnit(c.getSectionMass())).append( " total)"); + } } if ( c.isMassOverridden() ) {