From 212685b026720576e8f250485876bb7e488ee5cd Mon Sep 17 00:00:00 2001 From: Daniel_M_Williams Date: Sat, 14 Oct 2017 09:57:27 -0400 Subject: [PATCH] [resolves #328][save][load] Fixed invalid save & load fields for 'FinSet', 'LineInstanceable' Components - PodSet may save/load auto-radial-offset - Fins now save/load - 'instancecount' - 'angularoffset' - 'radialoffset' = 'auto' - RadiusPositionable interface now enforces 'setAutoRadialOffset(...)' - implemented RockeComponentSaver#emitInteger - all LineInstanceable implementers read/write 'instanceseparation' - [fix] RocketComponentSaver now saves 'instancecount' even if 1==instancecount --- .../openrocket/importt/DocumentConfig.java | 23 ++++++++-- .../file/openrocket/savers/FinSetSaver.java | 7 +++- .../savers/RocketComponentSaver.java | 42 ++++++++++--------- .../sf/openrocket/rocketcomponent/FinSet.java | 5 +++ .../rocketcomponent/RingInstanceable.java | 4 +- .../position/RadiusPositionable.java | 5 +-- 6 files changed, 57 insertions(+), 29 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 8f143c463..c448abf0a 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java @@ -187,7 +187,7 @@ class DocumentConfig { // RailButton setters.put("RailButton:instancecount", new IntSetter( Reflection.findMethod( RailButton.class, "setInstanceCount",int.class))); - setters.put("RailButton:linseparation", new DoubleSetter( + setters.put("RailButton:instanceseparation", new DoubleSetter( Reflection.findMethod( RailButton.class, "setInstanceSeparation", double.class))); setters.put("RailButton:angularoffset", new DoubleSetter( Reflection.findMethod( RailButton.class, "setAngularOffset", double.class), Math.PI / 180.0)); @@ -242,8 +242,16 @@ class DocumentConfig { // FinSet setters.put("FinSet:fincount", new IntSetter( Reflection.findMethod(FinSet.class, "setFinCount", int.class))); + setters.put("FinSet:instancecount", new IntSetter( + Reflection.findMethod(FinSet.class, "setInstanceCount", int.class))); setters.put("FinSet:rotation", new DoubleSetter( Reflection.findMethod(FinSet.class, "setBaseRotation", double.class), Math.PI / 180.0)); + setters.put("FinSet:angularoffset", new DoubleSetter( + Reflection.findMethod(FinSet.class, "setAngularOffset", double.class), Math.PI / 180.0)); + setters.put("FinSet:radialoffset", new DoubleSetter( + Reflection.findMethod(FinSet.class, "setRadialOffset", double.class), + "auto", + Reflection.findMethod(FinSet.class, "setAutoRadialOffset", boolean.class))); setters.put("FinSet:thickness", new DoubleSetter( Reflection.findMethod(FinSet.class, "setThickness", double.class))); setters.put("FinSet:crosssection", new EnumSetter( @@ -261,6 +269,7 @@ class DocumentConfig { setters.put("FinSet:filletmaterial", new MaterialSetter( Reflection.findMethod(FinSet.class, "setFilletMaterial", Material.class), Material.Type.BULK)); + // TrapezoidFinSet setters.put("TrapezoidFinSet:rootchord", new DoubleSetter( Reflection.findMethod(TrapezoidFinSet.class, "setRootChord", double.class))); @@ -425,10 +434,18 @@ class DocumentConfig { setters.put("PodSet:instancecount", new IntSetter( Reflection.findMethod(PodSet.class, "setInstanceCount",int.class))); setters.put("PodSet:radialoffset", new DoubleSetter( - Reflection.findMethod(PodSet.class, "setRadialOffset", double.class))); + Reflection.findMethod(PodSet.class, "setRadialOffset", double.class), + "auto", + Reflection.findMethod(PodSet.class, "setAutoRadialOffset", boolean.class))); + + setters.put("ParallelStage:radialoffset", new DoubleSetter( + Reflection.findMethod(ParallelStage.class, "setRadialOffset", double.class), + "auto", + Reflection.findMethod(ParallelStage.class, "setAutoRadialOffset", boolean.class))); + setters.put("PodSet:angularoffset", new DoubleSetter( Reflection.findMethod(PodSet.class, "setAngularOffset", double.class),Math.PI / 180.0)); - + // Streamer setters.put("Streamer:striplength", new DoubleSetter( Reflection.findMethod(Streamer.class, "setStripLength", double.class))); diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java index 30e321f40..f968215ec 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java @@ -12,8 +12,11 @@ public class FinSetSaver extends ExternalComponentSaver { super.addParams(c, elements); net.sf.openrocket.rocketcomponent.FinSet fins = (net.sf.openrocket.rocketcomponent.FinSet) c; - elements.add("" + fins.getFinCount() + ""); - elements.add("" + (fins.getBaseRotation() * 180.0 / Math.PI) + ""); + + // // this information is already saved as 'RingInstanceable' in RocktComponent + // elements.add("" + fins.getFinCount() + ""); + // elements.add("" + (fins.getBaseRotation() * 180.0 / Math.PI) + ""); + elements.add("" + fins.getThickness() + ""); elements.add("" + fins.getCrossSection().name().toLowerCase(Locale.ENGLISH) + ""); diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java index 960def5a3..ee0ba10a6 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java @@ -84,25 +84,23 @@ public class RocketComponentSaver { if ( c instanceof Instanceable) { int instanceCount = c.getInstanceCount(); - if( 1 < instanceCount ){ - if( c instanceof Clusterable ){ - ; // no-op. Instance counts are set via named cluster configurations - } - if( c instanceof LineInstanceable ){ - LineInstanceable line = (LineInstanceable)c; - emitString( elements, "instancecount", Integer.toString( instanceCount ) ); - emitDouble( elements, "linseparation", line.getInstanceSeparation()); - } - if( c instanceof RingInstanceable){ - RingInstanceable ring = (RingInstanceable)c; - emitString( elements, "instancecount", Integer.toString( instanceCount )); - if( ring.getAutoRadialOffset() ){ - emitString(elements, "radialoffset", "auto"); - }else{ - emitDouble( elements, "radialoffset", ring.getRadialOffset() ); - } - emitDouble( elements, "angularoffset", ring.getAngularOffset()*180.0/Math.PI); + if( c instanceof Clusterable ){ + ; // no-op. Instance counts are set via named cluster configurations + } + if( c instanceof LineInstanceable ){ + LineInstanceable line = (LineInstanceable)c; + emitInteger( elements, "instancecount", instanceCount ); + emitDouble( elements, "instanceseparation", line.getInstanceSeparation()); + } + if( c instanceof RingInstanceable){ + RingInstanceable ring = (RingInstanceable)c; + emitInteger( elements, "instancecount", instanceCount ); + if( ring.getAutoRadialOffset() ){ + emitString(elements, "radialoffset", "auto"); + }else{ + emitDouble( elements, "radialoffset", ring.getRadialOffset() ); } + emitDouble( elements, "angularoffset", ring.getAngularOffset()*180.0/Math.PI); } } @@ -250,11 +248,15 @@ public class RocketComponentSaver { } protected static void emitDouble( final List elements, final String enclosingTag, final double value){ - emitString( elements, enclosingTag, Double.toString( value )); + emitString( elements, enclosingTag, Double.toString( value )); + } + + protected static void emitInteger( final List elements, final String enclosingTag, final int value){ + elements.add("<"+enclosingTag+">" + Integer.toString( value ) + ""); } protected static void emitString( final List elements, final String enclosingTag, final String value){ - elements.add("<"+enclosingTag+">" + value + ""); + elements.add("<"+enclosingTag+">" + value + ""); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java index 4e5b65552..6daa3ce78 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java @@ -779,6 +779,11 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab public void setRadialOffset(double radius) { // no-op. Not allowed for fins } + + @Override + public void setAutoRadialOffset( final boolean auto ) { + // no-op. Fins are *always* automatically positioned + } @Override public void setInstanceCount(int newCount) { diff --git a/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java b/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java index 8d58b8270..bdd846e6c 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java @@ -15,10 +15,12 @@ public interface RingInstanceable extends Instanceable, AnglePositionable, Radiu public double[] getInstanceAngles(); + @Override + public boolean getAutoRadialOffset(); @Override public double getRadialOffset(); @Override - public boolean getAutoRadialOffset(); + public void setAutoRadialOffset( final boolean auto ); @Override public void setRadialOffset(final double radius); diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java b/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java index 8b783c9c3..0a812e564 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java +++ b/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java @@ -1,9 +1,8 @@ package net.sf.openrocket.rocketcomponent.position; public interface RadiusPositionable { - - public double getRadialOffset(); public boolean getAutoRadialOffset(); + public double getRadialOffset(); + public void setAutoRadialOffset( final boolean auto ); public void setRadialOffset(final double radius); - }